如何在linux中使用shell脚本杀死进程时获取退出代码=0

Posted

技术标签:

【中文标题】如何在linux中使用shell脚本杀死进程时获取退出代码=0【英文标题】:how to get Exit code=0 while killing a process using shell script in linux 【发布时间】:2022-01-13 07:49:10 【问题描述】:

我正在使用 shell 脚本中的“kill -9 pid”杀死多个进程,并且正如预期的那样,退出代码是非零的。

有没有什么方法可以在获取退出代码 0 的同时使用它的 pid 杀死进程?

代码sn-p:

echo $1 $2
for pid in $(ps -ef | grep "$1" | grep "$2" | grep "main-app" | grep -v grep | awk 'print $2'); do
    kill -9 $pid 
    exit 0
done

【问题讨论】:

你为什么要那个?这听起来像XY Problem 如果您希望进程通过退出 0 来响应信号,那么该进程将需要处理该信号。由于无法捕获 SIGKILL,因此您将无法使用 kill -9 执行此操作。清理接收进程,让它处理 SIGTERM 并停止用大锤砸它。 【参考方案1】:

在一般情况下,进程被杀死时的退出代码是不可预测的。

Bash 小心地将被终止进程的退出代码设置为 128 + 它被终止的信号,因此kill -9 将始终导致 Bash 报告退出代码 137。

尤其是kill -9,接收进程完全无法控制其退出代码;它会立即被杀死。

无论如何,很难说在任何情况下,当进程被强制中断时,它应该报告成功。当然,如果您可以控制进程的源代码,您可以在某些信号上显式设置为exit 0(但同样不能用于无法处理的kill -9)。

除此之外:您应该基本上从不使用kill -9。这是一个紧急停止,只能在不寻常的情况下使用(即使那样你也应该知道自己在做什么)。

顺便说一句,您想删除那里的useless greps。

for pid in $(ps -ef |
    awk -v first="$1" -v second="$2" -v app="main-app" '
        $0 ~ first && $0 ~ second && $0 ~ app && !/awk/ print $2')
do
    kill "$pid"
done

您在其中的exit 0 将终止当前 shell(当然,退出循环)。

顺便说一句,链接页面也有一个关于为什么要避免kill -9的部分。

【讨论】:

以上是关于如何在linux中使用shell脚本杀死进程时获取退出代码=0的主要内容,如果未能解决你的问题,请参考以下文章

Linux Shell脚本实现根据进程名杀死进程

如何在脚本中获取进程ID

Linux Shell脚本实现根据进程名杀死进程

linux shell脚本如何启动一个java进程

如何杀死shell的所有子进程?

如何杀死正在运行的python进程? [复制]