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