我正在运行一个shell脚本,比如bash中的sh script.sh
。该脚本包含许多行,其中一些需要几秒钟而其他行需要几天才能执行。如何杀死sh
命令但不杀死当前正在运行的命令(脚本中的当前行)?
答案 0 :(得分:2)
你没有详细说明当你“杀死”你的脚本时应该发生什么。但是我假设你想要完成当前正在执行的行,然后在做更多的工作之前退出。
这可能最好只能通过编写脚本来表现,以便接收这样的kill命令并以适当的方式响应 - 我不认为在linux中有任何魔法。
例如:
touch /var/tmp/trigger
)然后在脚本中的每一行之后,您需要检查是否已调用每个陷阱(或创建了触发器文件) - 然后退出。如果尚未设置触发器,则继续执行下一项工作。
据我所知,你不能陷入SIGKILL
( - 9) - 如果有人将其发送到您的流程,那么它就会死亡。
HTH,Ace
答案 1 :(得分:2)
我能想到的唯一方法是让父进程捕获kill信号,设置一个标志,然后在脚本中执行另一个命令之前重复检查这个标志。
然而,子过程也需要对杀伤信号免疫。然而,bash似乎以这种方式表现出与ksh的不同,并且下面似乎工作正常。
#!/bin/bash
QUIT=0
trap "QUIT=1;echo 'term'" TERM
function terminated {
if ((QUIT==1))
then
echo "Terminated"
exit
fi
}
function subprocess {
typeset -i N
while ((N++<3))
do
echo $N
sleep 1
done
}
while true
do
subprocess
terminated
sleep 3
done
答案 2 :(得分:1)
我假设您的脚本已经运行了好几天,然后您不想在不知道其中一个孩子是否完成的情况下杀死它。
使用ps
找到您的流程的pid。
然后
child=$(pgrep -P $pid)
while kill -s 0 $child
do
sleep 1
done
kill $pid