当我运行 Bash 脚本时,如何确保相同的脚本尚未运行?

当我运行 Bash 脚本时,如何确保相同的脚本尚未运行?

我已经看到了一些建议,如果脚本的另一个实例已经在运行,我可以如何终止脚本。我的问题是相反的:我想找到一种方法来杀死同一脚本的所有其他实例(如果有的话)并继续执行我的脚本。有什么办法可以做到这一点吗?

答案1

您可以执行类似...的操作PIDS=$(pidof -x nameofyourscript)来获取所有 pid(如果有),包括脚本。然后你就可以kill $PIDS

编辑:由于上面的内容也会杀死您当前的脚本,然后修改答案,添加-o如下选项:PIDS=$(pidof -x -o $$ nameofyourscript)-o $$将使其省略当前脚本的 pid。

更好的是,不用硬编码 nameofyourscript,只需从以下位置获取它自己的名称$0

kill $(pidof -x -o $$ $0)

因此,请将其放在脚本的开头附近,也许可以使用2>/dev/null,以防它找不到其他实例,并且问题得到解决。

答案2

在你的脚本中:

# store the Process ID here
pidfile=/var/run/mypid.local
# If there's a stored PID, terminate with SIGKILL
[[ -f $pidfile ]] && kill -s 9 $(cat $pidfile)
# Save our PID for the next run to kill
echo "$$" >$pidfile
  

并且,在你之前进行清理exit

rm $pidfile

相关内容