use*_*590 0 shell awk process kill-process
以下是我的脚本“Infinite.sh”代码,我在后台运行此脚本,在运行此脚本之前,我想杀死所有以前的实例。但这也杀死了我当前的实例。
kill -9 `ps ux|grep Infinite.sh|awk -F\ '{print $2}'`
while true;
do
echo -n "SLEEPING FOR 5 SECOND"
date
sleep 5
done
Run Code Online (Sandbox Code Playgroud)
只需从列表中删除当前进程的 PID 即可。为此,只需对代码进行最小的更改:
kill -9 `ps ux | grep Infinite.sh | awk -F\ -v pid=$$ 'pid != $2 {print $2}'`
Run Code Online (Sandbox Code Playgroud)
该选项-v pid=$$
将 awk 变量设置pid
为当前进程的进程 ID 的值。pid != $2 {print $2}
仅当进程 ID 与当前进程的进程 ID 不同时,该表达式才会打印该进程 ID。
为了简化代码,我们可以使用pgrep
:
kill -9 $(pgrep Infinite.sh | grep -v $$)
Run Code Online (Sandbox Code Playgroud)
正如 Triple 在评论中指出的那样,kill -9
只能作为最后的手段使用。 -9
(SIGKILL) 阻止进程自行清理、删除临时文件等。可能需要首先尝试的其他信号包括 -2
(SIGINT)、-6
(SIGABRT) 或-15
(SIGTERM,这是默认值)。至于使用哪些信号,Randal L. Schwartz建议:
一般来说,发送 15,然后等待一两秒,如果不起作用,则发送 2,如果不起作用,则发送 1。如果不起作用,请删除二进制文件,因为该程序的行为很糟糕!
有关为什么kill -9
应避免的更多详细信息,请参阅此处。有关各种 Unix 信号及其含义的更多信息,请参阅wikipedia
正如 mattalxndr 指出的那样,现代 Linux 系统提供了以下功能pkill
,从而减少了所需的命令:
pkill Infinite.sh
Run Code Online (Sandbox Code Playgroud)
除非指定另一个信号,否则pkill
发送SIGTERM
(15),这是第一次尝试终止进程时发送的首选信号。 pkill
提供多种选择。man pkill
详情请参阅。