在指定时间停止 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

相关内容