「at」コマンドを使用して送信されたバッチジョブのランタイムログを確認するには?

「at」コマンドを使用して送信されたバッチジョブのランタイムログを確認するには?

Ubuntu 20でバッチジョブを送信しています。

at now -f myscript.sh

操作が完了すると、ログを含む電子メールが届きます。しかし、時間がかかる作業の場合は、実行の進行状況を確認したいと思います。どうすればいいですか?

答え1

これは非常に冗長ですが、myscript.shの最初の行にあるシェルに-xを追加すると、スクリプトの行ごとの実行が表示されます。出力はジョブを送信したユーザーに電子メールで送信され、cronログにも表示されます。

たとえば、 #!/bin/sh の代わりに #!/bin/sh -x を使用します。

作業中にtail -f cron logを実行して進行状況を確認してください。ちなみにこれを行うと、多くのログデータが生成されます。どのような方法で進行状況を表示するためにスクリプトを変更することを選択できますか? echo "分解が完了しました。xxxのインストールを開始してください。"

答え2

このatツールはプロセスの標準出力をキャプチャし、それをログに送信します。したがって、ログを大幅に変更せずに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

atこの場合、メールで送信された内容の短いログ(たった2行)と長期実行の内部部分のすべてのログがあります。

この方法の拡張により、tee標準出力をファイルにコピーできます。これにより、スクリプトからログメッセージを繰り返し印刷するのに役立ちます。

#!/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

関連情報