Bash
當我的主腳本停止時,如何停止內聯後台程序?
在 shell 腳本中,我執行以下操作:
#!/bin/sh while true; do <some application>; sleep 1; done & ... rest of the scrip ...
這保證了應用程序始終在執行,因為腳本的其餘部分需要這樣做。然而,該腳本是有彈性的,所以如果應用程序似乎沒有執行並且回答不正確,它將稍後重試。
當主腳本終止時,例如由於
SIGTERM
orSIGINT
,我希望該while
循環也停止。主腳本終止後無需繼續執行應用程序。在 shell 腳本中執行此操作的常用方法是什麼?請注意,我想要兩件事:
- 防止重新執行應用程序
- 盡快停止目前正在進行的應用程序實例
我不確定如何在 shell 腳本中完成所有這些操作。我可以擷取
INT
andTERM
,但我不確定如何將邏輯註入while
循環以及如何停止應用程序。請注意,我目前在 plain 工作,但如果需要
sh
,我可以繼續工作。bash
您在腳本中想要的不是無限循環,而是鎖定文件。
然後呼叫在包裝腳本中執行工作的腳本。
#!/bin/sh if [ -f /tmp/.lock.my-mgr ] then echo "Program in use ... exiting ..." exit 10 fi /bin/touch /tmp/.lock.my-mgr /usr/local/bin/myscript.sh /bin/rm /tmp/.lock.my-mgr
如果您希望此任務每隔幾分鐘作為批處理完成,請使用 cron 來安排該任務。
編輯:
使用循環執行的腳本的 PID 可以放在一個文件中,例如
echo $! > /var/tmp/script1.pid
(在一個腳本中)。
要測試它是否來自第二個腳本,請使用 ps 命令,例如
ps -p `cat /var/tmp/script1.pid`
然後用 $? 測試它的狀態 如果 ps 找到該 pid,則該變數應為 0,否則應為 1。這是基本邏輯,但可以用更好的測試來編寫,例如 pid 文件不存在的情況。