gpt4 book ai didi

linux - kill 命令在 awk 中不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 10:42:59 25 4
gpt4 key购买 nike

有一个unix shell命令,像这样:

lsof -i:8888 | awk ' $2 ~ /^[0-9]+$/ { print $2;kill -9 $2 } '

它可以正确地打印出我想杀掉的pid,但是kill命令并没有杀掉这个pid的进程,但是如果我单独运行它就可以了,那就是:首先,运行

lsof -i:8888 | awk ' $2 ~ /^[0-9]+$/ { print $2} '

找到我想杀死的pid然后,运行

kill <pid>#pid is get from last command

那么进程就会被正确杀死,

我在mac上运行,谁能告诉我为什么会出现这种情况以及如何解决,谢谢!

最佳答案

awk 中没有kill 命令,您需要使用不同的方法,更简单的方法是调用 shell kill 命令。

如果您真的想从 awk 内部执行此操作,这里有一种可能仍然不是最佳的方法:

lsof -i:8888 | awk '
$2 ~ /^[0-9]+$/ {
print $2
command=sprintf("kill -9 %d",$2)
system(command)
close(command)
} '

注意1:回答注释只能执行awk支持的命令,其他的将被忽略?

是的,作为 awk 处理其指令的方式的副作用,大多数其他“命令”在 awk 中确实可能被忽略,如果它们与 shell 语法一起使用的话像你一样。使用 awk 语法 kill(-9,$2) 会触发错误,但 kill -9 $2 不会。可能所有 awk 实现都不会将未定义的标记视为语法错误。他们只是将其作为变量转换为它的值,这里是一个空字符串或 0,并将参数连接到它,如果有的话。在某些情况下,这可能会导致错误,例如当 awk 内置命令出现在参数中时,命令名称具有由点引入的后缀(例如 command.sh),使其无效变量名,或者如果给出了完整路径,这可能会触发令人费解的错误消息,如以下测试所示:

这个 awk 脚本:

BEGIN {
/usr/bin/kill -9 9999
}

将产生这些消息,具体取决于所使用的 awk 实现:

Legacy awk(原来的旧实现)

awk: syntax error near line 2
awk: illegal statement near line 2

标准 awk(又名 nawk)

nawk: division by zero
source line number 2

GNU awk(又名 gawk)

gawk: test:2: fatal: division by zero attempted

Mike 的 awk(又名 mawk)

* No error reported, no output

忙碌框 awk

awk: test:2: Division by zero

注意 2:在您的情况下,虽然它可以正常工作,但使用我描述的方法没有多大意义,因为它会矫枉过正。这就是为什么我写了“你真的想从 awk 里面做吗”。

但是,肯定有更复杂的情况,其中 system()awk 非常有用,尽管它本身很危险,就像其他几种编程语言一样。

关于linux - kill 命令在 awk 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34236675/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com