【问题标题】:how to get Exit code=0 while killing a process using shell script in linux如何在linux中使用shell脚本杀死进程时获取退出代码=0
【发布时间】: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 并停止用大锤砸它。

标签: linux bash shell unix scripting


【解决方案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的部分。

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 2016-07-08
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    相关资源
    最近更新 更多