Ubuntu 20 でバッチジョブを送信します。
at now -f myscript.sh
ジョブが完了すると、ログが記載されたメールが届きます。しかし、時間のかかるジョブの場合は、実行中に進行状況を確認したいのですが、どうすればよいですか?
答え1
これは非常に冗長になりますが、myscript.sh の最初の行のシェルに -x を追加すると、スクリプトの実行が行ごとに表示されます。出力はジョブを送信したユーザーに電子メールで送信され、cron ログにも表示されます。
たとえば、#!/bin/sh の代わりに #!/bin/sh -x を使用します。
ジョブの進行中は、cron ログを tail -f するだけで進行状況を確認できます。注意: これにより大量のログ データが生成されます。スクリプトを変更して、何らかの方法で進行状況を表示することもできます。echo "分解が終了しました。xxx のセットアップを開始しています"
答え2
ツールat
はプロセスの stdout をキャプチャし、それをログとして送信します。そのため、ログに大きな変更を加えない限り、at
書き込まれたログをそのまま読み取ることはできません。
しかし、2 番目のログを使用して回避策を実行できます。既知の名前のファイルに「進行状況」ログを出力するだけです。その後は、tail -f
必要に応じてログを実行するか、無視してください。
つまり、実行するスクリプトはat
次のようになります。
#!/bin/sh
echo Started at `date`
echo Started at `date` > /var/myscript.log
some_long_running_process_with_log >> /var/myscript.log
rc=$?
echo Completed at `date` with return code $rc
echo Completed at `date` with return code $rc >> /var/myscript.log
この場合、メールで送信するための短いログ (2 行のみ)at
と、長時間実行されている内部部分からのすべてのログが作成されます。
このアプローチの拡張として、 を使用できますtee
。これにより、stdout をファイルに複製できます。これにより、スクリプト内でのログ メッセージの印刷の複製に役立ちます。
#!/bin/sh
echo Started at `date` | tee /var/myscript.log
some_long_running_process_with_log >> /var/myscript.log
rc=$?
echo Completed at `date` with return code $rc | tee -a /var/myscript.log