夜間にダウンロードをスケジュールしようとしています。午前 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