如果正在运行,则第一次杀死先前的实例

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)

Joh*_*024 5

只需从列表中删除当前进程的 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详情请参阅。