如何杀死shell脚本而不杀死当前执行的行

时间:2015-09-23 20:37:24

标签: linux bash shell

我正在运行一个shell脚本,比如bash中的sh script.sh。该脚本包含许多行,其中一些需要几秒钟而其他行需要几天才能执行。如何杀死sh命令但不杀死当前正在运行的命令(脚本中的当前行)?

3 个答案:

答案 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