我正在尝试安排晚上的下载。我创建了一个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