![当我运行 Bash 脚本时,如何确保相同的脚本尚未运行?](https://linux22.com/image/182942/%E5%BD%93%E6%88%91%E8%BF%90%E8%A1%8C%20Bash%20%E8%84%9A%E6%9C%AC%E6%97%B6%EF%BC%8C%E5%A6%82%E4%BD%95%E7%A1%AE%E4%BF%9D%E7%9B%B8%E5%90%8C%E7%9A%84%E8%84%9A%E6%9C%AC%E5%B0%9A%E6%9C%AA%E8%BF%90%E8%A1%8C%EF%BC%9F.png)
我已经看到了一些建议,如果脚本的另一个实例已经在运行,我可以如何终止脚本。我的问题是相反的:我想找到一种方法来杀死同一脚本的所有其他实例(如果有的话)并继续执行我的脚本。有什么办法可以做到这一点吗?
答案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