我有一个调用脚本的cron作业,该脚本每小时检查一次更新。如果有更新,则会调用update.sh
,然后调用commands.sh
。我希望每个"新" commands.sh
只能运行一次。
每当我使用该文件的一些唯一ID运行commands.sh
时,我一直在考虑写入文件。在运行commands.sh
之前,我会检查文件是否包含commands.sh
的ID。如果是这样,请不要运行它。
编辑 - 更多细节:
的cronjob:
运行update.sh
:
#!/bin/sh
./commands.sh
我希望./commands.sh
只运行一次,因为下一个小时,cron会再次运行,从git中拉出来,然后再次运行update.sh
。每个唯一./commands.sh
只能运行一次吗?
写完之后,如果git repo发生了变化,最好的方法就是只运行update.sh
?
这看起来有点矫枉过正,难以维持。有没有更简单的方法来编写只运行一次的bash脚本?
答案 0 :(得分:1)
在commands.sh
脚本开头执行此操作:
if [ -f stampfile ]; then
exit
if
touch stampfile
这将检查名为stampfile
的文件(指定可以存储的方便位置的路径)。如果它在那里,只需exit
。如果不是,则使用touch
创建它。
然后让脚本做它的事情。
略微偏离:这也可以用来避免同时运行两个脚本实例。然后,脚本在运行结束时rm -f stampfile
。
在这种情况下,如果脚本被终止,stampfile
将会过时"陈旧" (邮票存在但脚本不存在)。要检测陈旧stampfile
,请将脚本的PID放入其中,而不是触摸它。
检查是否有其他实例正在运行,并管理戳文件:
if [ -f stampfile ]; then
if kill -0 $(<stampfile) 2>/dev/null; then
exit
else
rm -f stampfile # stale
fi
fi
echo $$ >stampfile
# rest of script
rm -f stampfile
用户@CharlesDuffy指出这种管理stampfile
的方式可能容易出现PID重用问题,即陈旧stampfile
中的PID可能是正在运行的进程中的PID。做任何这些。显然a Linux utility called flock
允许您以更强大的方式执行此操作。