如何在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 grep
s。
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的主要内容,如果未能解决你的问题,请参考以下文章