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コードを実行しfree
、ps
10秒ごとにログに追加し、メモリまたはCPUが問題であることを確認します。