我正在尝试编写一个用于终止进程的简单脚本。我已经阅读了Find and kill a process in one line using bash and regex所以请不要将我重定向到那个。
这是我的代码:
LINE=$(ps aux | grep '$1')
PROCESS=$LINE | awk '{print $2}'
echo $PROCESS
kill -9 $PROCESS
我希望能够运行像
这样的东西 sh kill_proc.sh node
让它运行
kill -9 node
但我得到的是
kill_process.sh: line 2: User: command not found
我发现当我记录$PROCESS
时它是空的。
有谁知道我做错了什么?
答案 0 :(得分:3)
PROCESS=$(echo "$LINE" | awk '{print $2}')
或
PROCESS=$(ps aux | grep "$1" | awk '{print $2}')
我不知道你为什么会收到你引用的错误。我无法重现它。当你这样说:
PROCESS=$LINE | awk '{print $2}'
shell将其扩展为类似的内容:
PROCESS='mayoff 10732 ...' | awk '{print $2}'
(我已缩短$LINE
的值以使示例可读。)
管道的第一个子命令设置变量PROCESS
;此变量设置命令没有输出,因此awk
立即读取EOF并且不打印任何内容。并且由于管道的每个子命令都在子shell中运行,因此PROCESS
的设置仅在子shell中进行,而不是在运行脚本的父shell中进行,因此PROCESS
仍未设置为以后的命令你的剧本。
(请注意,某些版本的bash
可以在当前shell而不是子shell中运行管道的最后一个子命令,但这不会影响此示例。)
您希望将PROCESS
的值提供给awk
并将结果存储到标准输入中,而不是在子shell中设置LINE
并且不向awk
提供任何内容当前shell中的PROCESS
。因此,您需要运行一个将LINE
的值写入其标准输出的命令,并将该标准输出连接到awk
的标准输入。 echo
命令可以执行此操作(或printf
命令,正如chepner在其答案中指出的那样。)
答案 1 :(得分:2)
您需要使用echo
(或printf
)将$LINE
的值实际放入awk
命令的标准输入中。
LINE=$(ps aux | grep "$1")
PROCESS=$(echo "$LINE" | awk '{print $2}')
echo $PROCESS
kill -9 $PROCESS
没有必要使用LINE
;您可以使用一行设置PROCESS
PROCESS=$(ps aux | grep "$1" | awk '{print $2}')
或更好,跳过grep
:
PROCESS=$(ps aux | awk -v pname="$1" '$1 ~ pname {print $2}')
最后,不要使用kill -9
;这是调试错误程序的最后手段。对于你自己没有写过的任何程序,kill "$PROCESS"
就足够了。