[英]bash cron flock screen
我正在使用cron定期運行bash腳本,並嘗試使用flock防止此腳本及其創建的進程多次運行。
每分鍾運行一次的crontab中的條目是:
*/1 * * * * flock -n /tmp/mylockfile /home/user/myscript.sh arg1 arg2
問題是,myscript.sh以分離模式生成多個屏幕會話,其中包含
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 &
鎖定行為與我想要的完全一樣,只是我不再擁有單獨的屏幕了。
根據您的確切需求,您可以連續運行下標循環,也可以為每個循環創建單獨的屏幕會話。
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
其他有用的命令還有screen -ls
和ps aux | grep screen
ps aux | grep screen
,顯示您當前正在運行的屏幕和進程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.