【发布时间】:2016-07-21 17:49:43
【问题描述】:
我正在使用 cron 定期运行 bash 脚本,并尝试使用 flock 来防止该脚本及其创建的进程被多次运行。
crontab 中每分钟运行一次的条目是:
*/1 * * * * flock -n /tmp/mylockfile /home/user/myscript.sh arg1 arg2
问题是,myscript.sh 以分离模式生成多个 screen 会话,它包含
for i in {1..3};
do
screen -d -m ./mysubscript.sh arg3
done
使用上面的“-d -m”运行屏幕以“分离”模式作为分叉进程启动屏幕,但这些进程不会从flock继承锁定,因此每分钟会出现3个运行mysubscript.sh的新屏幕进程.
如果我改用“-D -m”,那么在 mysubscript.sh 完成之前只有一个屏幕进程一直运行,而不是三个。
如果运行 mysubscript.sh 的屏幕进程都没有运行,我需要的是群起只运行 myscript.sh。
如何做到这一点?屏幕或羊群中是否有标志可以帮助实现这一目标?
编辑:如果我将 for 循环内的行更改为运行 mysubscript.sh 作为后台进程:
./mysubscript.sh arg3 &
锁定行为正是我想要的,只是我不再有单独的屏幕。
【问题讨论】:
-
你需要每个下标循环使用一个单独的屏幕,还是它们都可以在同一个屏幕上运行?
-
理想情况下,它们每个都在一个单独的屏幕上,但都在同一个屏幕上总比没有好。
-
两者都做很简单,我会在一分钟内为你发布答案:)
标签: linux bash cron gnu-screen