指定された時間に atd ジョブを停止する

指定された時間に atd ジョブを停止する

夜間にダウンロードをスケジュールしようとしています。午前 2 時にダウンロード スクリプトを開始するジョブを作成しましたatd。同じジョブがまだ実行中の場合は、午前 7 時に停止したいと考えています。今やっていることは、ただ です。指定した時間にジョブをshutdown -h 7:00停止することは可能ですか?atd

答え1

at停止時間を指定できるメカニズムは見当たりません。at午前 7 時に別のジョブをスケジュールして、これらのジョブのいずれかがまだ実行中かどうかを確認し、それらを強制終了します。

答え2

Atジョブはシェル インタープリタ (Linux では通常/bin/sh) を使用して実行されます。つまり、ジョブとして実行するコマンドは、atそのコマンドを実行するシェルの PID 番号で追跡できます。この PID は、特別なシェル変数 で簡単に取得できます$$。これをファイルに保存できます (現在のセッション シェルで展開されないようにするには、一重引用符が必須です)。

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 をどこかに書き込んで、それを強制終了できるようにします。2am ジョブの場合:

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

関連情報