我在运行脚本“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