我正在嘗試安排在晚上下載。我創建了一個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