bash cron 群屏
bash cron flock screen
我正在使用 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
运行 screen with "-d -m" 如上所述以 "detached" 模式启动 screen 作为分叉进程,但这些进程不从 flock 继承锁,因此每分钟 3 new屏幕进程 运行ning mysubscript.sh 出现。
如果我使用“-D -m”代替,那么在 mysubscript.sh 完成之前只有一个屏幕过程 运行s,而不是三个。
如果屏幕进程 运行ning mysubscript.sh 的 none 是 运行,我只需要 flock 到 运行 myscript.sh宁.
如何实现? screen 或 flock 中是否有可以帮助实现此目的的标志?
编辑:如果我将 for 循环内的行更改为 运行ning mysubscript.sh 作为后台进程:
./mysubscript.sh arg3 &
锁定行为完全符合我的要求,只是我不再有单独的屏幕。
根据您的具体需要,您可以 运行 您的下标连续循环或为每个创建单独的屏幕会话。
多屏方式
screens.sh
#!/bin/bash
if ! screen -ls | grep -q "screenSession"
then
for i in {1..3};
do
screen -S screenSession_${i} -d -m sh mysubscript.sh arg3 &
done
{ echo "waking up after 3 seconds"; sleep 3; } &
wait # wait for process to finish
exit # exit screen
else echo "Screen Currently Running"
fi
会话数
62646.screenSession_1 (Detached)
62647.screenSession_2 (Detached)
62648.screenSession_3 (Detached)
此方法将为循环的每次迭代设置屏幕并执行下标。如果 cron 碰巧在仍有活动套接字的情况下尝试 运行 脚本,那么它将退出直到下一个 cron。
单屏来电方式
screencaller.sh
#!/bin/bash
if ! screen -ls | grep -q "screenSession"
then screen -S screenSession -d -m sh screen.sh
else echo "Screen Currently Running"
fi
screen.sh
#!/bin/bash
for i in {1..3};
do
sh mysubscript.sh arg3
done
{ echo "waking up after 3 seconds"; sleep 3; } &
wait # wait for process to finish
exit # exit screen
会话
59916.screenSession (Detached)
此方法使用单独的调用程序脚本,然后在同一屏幕会话中一个接一个地循环您的下标。
这两种方法都会像这样执行(例如screens.sh,或screencaller.sh):
*/1 * * * * flock -n /tmp/mylockfile screens.sh arg1 arg2
或者,如果您想从 CLI 手动 运行 它,只需执行以下操作:
$ sh screens.sh
如果您想进入会话,只需调用 screen -r screenSession
。其他一些有用的命令是 screen -ls
和 ps aux | grep screen
,它们显示您当前正在 运行 的屏幕和进程。
我正在使用 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
运行 screen with "-d -m" 如上所述以 "detached" 模式启动 screen 作为分叉进程,但这些进程不从 flock 继承锁,因此每分钟 3 new屏幕进程 运行ning mysubscript.sh 出现。
如果我使用“-D -m”代替,那么在 mysubscript.sh 完成之前只有一个屏幕过程 运行s,而不是三个。
如果屏幕进程 运行ning mysubscript.sh 的 none 是 运行,我只需要 flock 到 运行 myscript.sh宁.
如何实现? screen 或 flock 中是否有可以帮助实现此目的的标志?
编辑:如果我将 for 循环内的行更改为 运行ning mysubscript.sh 作为后台进程:
./mysubscript.sh arg3 &
锁定行为完全符合我的要求,只是我不再有单独的屏幕。
根据您的具体需要,您可以 运行 您的下标连续循环或为每个创建单独的屏幕会话。
多屏方式
screens.sh
#!/bin/bash
if ! screen -ls | grep -q "screenSession"
then
for i in {1..3};
do
screen -S screenSession_${i} -d -m sh mysubscript.sh arg3 &
done
{ echo "waking up after 3 seconds"; sleep 3; } &
wait # wait for process to finish
exit # exit screen
else echo "Screen Currently Running"
fi
会话数
62646.screenSession_1 (Detached)
62647.screenSession_2 (Detached)
62648.screenSession_3 (Detached)
此方法将为循环的每次迭代设置屏幕并执行下标。如果 cron 碰巧在仍有活动套接字的情况下尝试 运行 脚本,那么它将退出直到下一个 cron。
单屏来电方式
screencaller.sh
#!/bin/bash
if ! screen -ls | grep -q "screenSession"
then screen -S screenSession -d -m sh screen.sh
else echo "Screen Currently Running"
fi
screen.sh
#!/bin/bash
for i in {1..3};
do
sh mysubscript.sh arg3
done
{ echo "waking up after 3 seconds"; sleep 3; } &
wait # wait for process to finish
exit # exit screen
会话
59916.screenSession (Detached)
此方法使用单独的调用程序脚本,然后在同一屏幕会话中一个接一个地循环您的下标。
这两种方法都会像这样执行(例如screens.sh,或screencaller.sh):
*/1 * * * * flock -n /tmp/mylockfile screens.sh arg1 arg2
或者,如果您想从 CLI 手动 运行 它,只需执行以下操作:
$ sh screens.sh
如果您想进入会话,只需调用 screen -r screenSession
。其他一些有用的命令是 screen -ls
和 ps aux | grep screen
,它们显示您当前正在 运行 的屏幕和进程。