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

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

夕方にダウンロード予約をしようとしています。atd午前2時にダウンロードスクリプトを起動するタスクを作成しました。今、同じタスクを午前7時に停止したい(まだ実行中の場合)。それが私が今やっていることですshutdown -h 7:00atd指定した時間にジョブを停止できますか?

答え1

at内部的に停止時間を指定するメカニズムはありません。午前7時に別のジョブをスケジュールし、atそのジョブがまだ実行中であることを確認して終了します。

答え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をどこかに記録してください。午前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

関連情報