如何在Linux中使用shell脚本杀死进程时获得Exit code=0

ybzsozfc  于 2023-08-03  发布在  Linux
关注(0)|答案(2)|浏览(147)

我在shell脚本中使用“kill-9 pid”杀死多个进程,正如预期的那样,退出代码为非零。
有没有办法在得到退出代码0的同时,使用进程的pid杀死进程?
代码片段:

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

字符串

xsuvu9jc

xsuvu9jc1#

在一般情况下,进程被终止时的退出代码是不可预测的。
Bash会小心地将被杀死进程的退出代码设置为128 +它被杀死的信号,所以kill -9总是会导致Bash报告退出代码137。
特别是对于kill -9,接收进程完全无法控制其退出代码;它会被立即杀死。
无论如何,很难争辩说,在任何情况下,当进程被强制中断时,它都应该报告成功。当然,如果您可以控制进程的源代码,您可以在某些信号上显式地将其设置为exit 0(但同样,不适用于无法处理的kill -9)。
旁白:你应该 * 基本上永远不要 * 使用kill -9。这是一个紧急停止,只应在不寻常的情况下使用(即使这样,你应该知道你在做什么)。
另外,您希望删除那里无用的grep

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的部分。

xxb16uws

xxb16uws2#

下面简单的一行解决方案可以在各种Linux/Unix上正常工作。我用Ubuntu,Mint,Centos,Amazon Linux和Alpine(Docker)测试了它。
这在一个新的shell中运行,这样你就可以正确地控制退出代码。

/bin/bash -c '/usr/bin/killall -q <process-name>; exit 0'

字符串

相关问题