我在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
字符串
xsuvu9jc1#
在一般情况下,进程被终止时的退出代码是不可预测的。Bash会小心地将被杀死进程的退出代码设置为128 +它被杀死的信号,所以kill -9总是会导致Bash报告退出代码137。特别是对于kill -9,接收进程完全无法控制其退出代码;它会被立即杀死。无论如何,很难争辩说,在任何情况下,当进程被强制中断时,它都应该报告成功。当然,如果您可以控制进程的源代码,您可以在某些信号上显式地将其设置为exit 0(但同样,不适用于无法处理的kill -9)。旁白:你应该 * 基本上永远不要 * 使用kill -9。这是一个紧急停止,只应在不寻常的情况下使用(即使这样,你应该知道你在做什么)。另外,您希望删除那里无用的grep。
kill -9
exit 0
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的部分。
xxb16uws2#
下面简单的一行解决方案可以在各种Linux/Unix上正常工作。我用Ubuntu,Mint,Centos,Amazon Linux和Alpine(Docker)测试了它。这在一个新的shell中运行,这样你就可以正确地控制退出代码。
/bin/bash -c '/usr/bin/killall -q <process-name>; exit 0'
2条答案
按热度按时间xsuvu9jc1#
在一般情况下,进程被终止时的退出代码是不可预测的。
Bash会小心地将被杀死进程的退出代码设置为128 +它被杀死的信号,所以
kill -9
总是会导致Bash报告退出代码137。特别是对于
kill -9
,接收进程完全无法控制其退出代码;它会被立即杀死。无论如何,很难争辩说,在任何情况下,当进程被强制中断时,它都应该报告成功。当然,如果您可以控制进程的源代码,您可以在某些信号上显式地将其设置为
exit 0
(但同样,不适用于无法处理的kill -9
)。旁白:你应该 * 基本上永远不要 * 使用
kill -9
。这是一个紧急停止,只应在不寻常的情况下使用(即使这样,你应该知道你在做什么)。另外,您希望删除那里无用的
grep
。字符串
您在那里拥有的
exit 0
将终止 * 当前 * shell(当然,退出循环)。顺便说一句,链接页面也有一个关于为什么要避免
kill -9
的部分。xxb16uws2#
下面简单的一行解决方案可以在各种Linux/Unix上正常工作。我用Ubuntu,Mint,Centos,Amazon Linux和Alpine(Docker)测试了它。
这在一个新的shell中运行,这样你就可以正确地控制退出代码。
字符串