一定時間スクリプトを実行した後、cronジョブは終了します。

一定時間スクリプトを実行した後、cronジョブは終了します。

1 日の間に異なる時間に複数の cronjob が実行されていますが、特定の cronjob のいずれかが期待どおりに実行されず、しばらくすると終了します。

0 0  * * * python3 /scratch/pyscripts/backdoor.py --user SEKHAR >> /scratch/tlog/backdoor.log 2>&1;

backdoor.pyスクリプトはforループで各ファイルを1つずつ実行し、1時間または約25個のファイルの後に突然終了します。ログファイルにはエラーメッセージや終了メッセージはありません。

ただし、手動で実行するとスムーズに実行されます。

この特定のcronjobが失敗した理由をどのようにデバッグできますか?

オペレーティングシステム:Linux - Debian

答え1

私の仕事は数時間続くことがあるので、本質的に仕事を制限するcronことはないと思います。cron私の傾向は、タスクpython自体がクラッシュすることです(しかし、タスクが何であるか、どのように書かれたのかわからず、ターミナルセッションで正しく実行されていると言ってくれてありがとう)。

おそらく、ジョブ自体の周りにラッパーを作成して、予期しないシャットダウンの根本原因を特定する問題を解決しますpython。これらのこと、

#!/bin/sh
#
exec 1>/scratch/tlog/backdoor.log 2>&1

dtStart=$(date +'%Y-%m-%d %H:%M')
printf "%s\tStarted at %s\n" "$dtStart" "$dtStart"

python3 /scratch/pyscripts/backdoor.py --user SEKHAR
ss=$?

dtStop=$(date +'%Y-%m-%d %H:%M')
printf "Uptime and load avg:%s\n" "$(uptime)"
printf "%s\tStarted at %s and stopped at %s with status %d\n\n" "$dtStop" "$dtStart" "$dtStop" $ss

その理由は、ジョブをcron終了すると「完了」メッセージを受け取る可能性はほとんどありませんが、ジョブの場合はpythonラッパーによって報告された終了ステータスと最終メッセージを受け取るためです。この情報を使用すると、調査に集中することができます。

答え2

私はなぜすべてのcronジョブがプロセス番号を3ずつ増やすのかを常に疑問に思いました。親と子の関係がクローン操作をどのように終了するかを調べるために、プロセスツリーを調べました。

$ crontab -l | grep 787
11 11 17 * * sleep 787
$ ps -ef | awk 'NR == 1 || /(685|380[0-9])/'
UID        PID  PPID  C STIME TTY          TIME CMD
root       685     1  0 10:31 ?        00:00:00 /usr/sbin/cron -f
root      3808   685  0 11:11 ?        00:00:00 /usr/sbin/CRON -f
paul      3809  3808  0 11:11 ?        00:00:00 /bin/sh -c sleep 787
paul      3810  3809  0 11:11 ?        00:00:00 sleep 787
paul      3914  3720  0 11:15 pts/1    00:00:00 awk NR == 1 || /(685|380[0-9])/
$ 

10:31は開始時間なので、プロセス685は初期cronデーモンです。

各ジョブに対して、cron出力メーリング、結果のロギングなどを担当するラッパーサブCRON(ここではpid 3808)が開始されます。

crontabコマンド自体を実行するためにサブシェル(pid 3809)を実行します。

pid 3810はcrontabでユーザーが定義したコマンドです。

Pid 3914はプロセスツリーのこの部分を報告します(685がそのパラメータにあるため、それ自体を報告します)。まず、実際のpidを見つける必要がありました(「787」の完全なpsのリストを見るにはgrep)。

685、3808、または3809は子にプロセスを停止するように指示することができますが、cronがこれを実行したことを見たことはありません(プロセスがCPUを超えてシェルから信号を送信するのを見たことがあります)。ただし、この情報を使用していくつかのデバッグを設計できます。たとえば、Pythonコードを実行しfreeps10秒ごとにログに追加し、メモリまたはCPUが問題であることを確認します。

関連情報