Bash

當我的主腳本停止時,如何停止內聯後台程序?

  • July 12, 2019

在 shell 腳本中,我執行以下操作:

#!/bin/sh

while true; do <some application>; sleep 1; done &

... rest of the scrip ...

這保證了應用程序始終在執行,因為腳本的其餘部分需要這樣做。然而,該腳本是有彈性的,所以如果應用程序似乎沒有執行並且回答不正確,它將稍後重試。

當主腳本終止時,例如由於SIGTERMor SIGINT,我希望該while循環也停止。主腳本終止後無需繼續執行應用程序。

在 shell 腳本中執行此操作的常用方法是什麼?請注意,我想要兩件事:

  1. 防止重新執行應用程序
  2. 盡快停止目前正在進行的應用程序實例

我不確定如何在 shell 腳本中完成所有這些操作。我可以擷取INTand TERM,但我不確定如何將邏輯註入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 文件不存在的情況。

引用自:https://unix.stackexchange.com/questions/529860