Bash脚本,如果它们正在运行,则会杀死其自身的实例

时间:2017-05-15 15:38:25

标签: bash

所以,我想创建一个bash脚本,我将在启动时运行它,但是我想更新脚本,如果我需要并在没有重启的情况下运行它,那么我想要什么do是让脚本在加载时检查它是否有任何其他实例正在运行,并且终止脚本以外的任何实例。我希望它检查bash的实例并获取正在运行的脚本的路径,并杀死具有与其自身相同的路径名的脚本的任何实例。我怎么能这样做?

示例:如果我在目录/ foo / bar中运行脚本../tball/script.sh,它将终止运行脚本/foo/tball/script.sh的任何bash实例存在。

2 个答案:

答案 0 :(得分:2)

最好的方法是在易失性文件系统中包含进程PID的文件,如下所示:

echo $$ > /run/script.pid

您可以通过检查PID是否存在来进一步优化它:

if [ ! -d /proc/$(< /run/script.pid) ] ; then
   rm /run/script.pid
fi

在你的脚本中你应该有这样的东西,在退出时删除文件或者它收到一个杀死进程的信号:

trap "rm -f /run/script.pid" EXIT INT QUIT TERM

编辑:或者您可以将PID附加到一个众所周知的路径名并在保存PID之前使用类似的东西终止所有脚本实例:

kill $(< /run/script.pid) ; sleep 10 ; kill -9 $(< /run/script.pid)

答案 1 :(得分:2)

这是基础

kill_others() {
   local mypid=$$    # capture this run's pid

   declare pids=($(pgrep -f ${0##*/}   # get all the pids running this script

   for pid in ${pids[@]/$mypid/}; do   # cycle through all pids except this one
      kill $pid                        # kill the other pids
      sleep 1                          # give time to complete
   done
}

declare -i count=0
while [[ $(pgrep -f ${0##*/}|wc -l) -gt 1 ]]; do
   kill_outhers
   ((++count))
   if [[ $count -gt 10 ]]; then
      echo "ERROR: can't kill pids" >&2
      exit 1
   fi
done