用于杀死-2 PID并重新启动进程的脚本

用于杀死-2 PID并重新启动进程的脚本

我在运行脚本“restart.sh”时遇到问题。它的主要目标是通过id杀死一个进程,然后重新启动该进程。

进程名称具有“DND”,如下所示

$ ps -ef | grep DND
root   18425     1 60 11:53 pts/0    00:40:34 java -jar DND_Retry.xml

注意:每次执行脚本时PID都会改变。

1 部分脚本如下:

  echo "Killing BND Process"

pids=$(pgrep -f BND)
for pid in "${pids}"; do
  if [[ $pid != $$ ]]; then
    kill -2 "$pid"
  fi
done

sleep 2

while true
do
shut1=`more /Data/v3/nohup_bnd.out |  grep  "has been shutdown" | wc -l`
        if [ $shut1 -eq 1 ]; then

    echo "process ended now restart"

问题是:脚本第一次成功执行,但是当我再次执行时,它不会终止进程。但是,如果我使用 Kill -9 手动终止进程,然后再次执行脚本,它会成功执行并产生所需的结果。

在上面的脚本/条件中我需要修改什么吗?我需要执行 Kill -2。

答案1

如果您有多个 PID 正在运行,则带引号的变量"${pids}"会导致问题。您需要删除引号。

例子:

$ pids=$(pgrep -f a_program_started_three_times)
$ for pid in "$pids"; do echo "pid is $pid"; done
pid is 563
564
565
$ for pid in $pids; do echo "pid is $pid"; done
pid is 563
pid is 564
pid is 565

选修的:

我会在 for 循环中添加一个额外的检查。

pids=$(pgrep -f BND)
# if pid(s) were found, then...
if [ $? -eq 0 ]; then
    # removed the quotes from "${pids}" here
    for pid in $pids; do
        if [[ $pid != $$ ]]; then
            kill -2 "$pid"
        fi
    done
fi

相关内容