在指定時間停止 atd 作業

在指定時間停止 atd 作業

我正在嘗試安排在晚上下載。我創建了一個atd在凌晨 2 點開始下載腳本的作業。現在,如果相同作業仍在運行,我想在早上 7 點停止該作業。我現在所做的只是shutdown -h 7:00。是否可以atd在指定時間停止工作?

答案1

我沒有看到內部有at允許您指定停止時間的機制。我只會at在早上 7 點安排另一項工作,檢查這些 at 工作是否仍在運行並殺死它們。

答案2

At作業是使用 shell 解釋器執行的(在 Linux 上,通常是這樣/bin/sh)。這意味著您要作為作業運行的任何命令都at可以透過要執行該命令的 shell 的 PID 號碼來追蹤。您可以簡單地使用特殊的 shell 變數來擷取這個 PID $$。您可以將其儲存到檔案中(必須使用單引號,以免在目前會話 shell 中展開它):

at 'echo $$ > /var/run/my_at_job.pid; your_command; rm /var/run/my_at_jon.pid' | at TIME_SPEC

然後,在另一個at作業中,您可以終止該作業及其所有產生的子程序 ( you_command):

if [ -r /var/run/at_job.pid ]; then
  for PID in $(ps --ppid `cat /var/run/at_job.pid` -o pid | sed -e '1d'); do
    kill $PID
  done
fi

答案3

您可以將超時納入您的工作中。

timeout "$(($(date +%s -d '7am') - $(date +%s)))" wget -c http://example.com/wibble

或者,讓您的作業在某處寫入其進程 ID,以便您可以殺死它。在凌晨 2 點的工作中:

echo $$ >~/.at.download.pid
wget -c http://example.com/wibble
rm ~/.at.download.pid

在早上 7 點的工作中:

if [ -e ~/.at.download.pid ]; then
  kill $(~/.at.download.pid)
  rm ~/.at.download.pid
fi

相關內容