web-dev-qa-db-ja.com

crontab内のpsには実行中のプロセスが表示されません

私はこのロボットworker.pyを所有しています。

python worker.py --details

このロボットを取り巻く多くの問題があるので、30分ごとに下降し続けます。

ロボットが実行されているとき、ps aux | grep worker.pyは私に出力を与えます:

root      3870  6.2 11.7 997960 59052 pts/0    Sl   10:47   0:32 python worker.py --details
root      4030  0.0  0.4   9752  2312 pts/0    S+   10:55   0:00 grep --color=auto worker

そこで、次のコマンドを使用して10分ごとに実行するようにcronを設定します。

cd /path/to/boot && if [ 2 -gt `ps aux | grep worker.py | wc -l` ]; then python worker.py --detail &> /dev/null ; fi

問題は:

  • 上記のコマンドをコマンドラインでまっすぐ実行するだけで正常に機能します(ロボットが実行中の場合は何も起こりません。ロボットが停止している場合は、再び起動します)。
  • Cronがコマンドを実行すると、現在のプロセスが表示されていないため、10分ごとに新しいプロセスが作成されます(データベースを処理します)。

上記はすべてルートとして作成されているため、ユーザーの問題に関するものではないと思います。

ありがとう

4
Thiago Melo

必要なのはロックファイルで、このロックファイルを確認します。存在する場合はスクリプトを終了し、存在しない場合は開始します。

コマンドの例は shlock です。

説明

Shlockは、nameという名前のロックファイルを作成し、プロセスID pidを書き込みます。ファイルがすでに存在する場合、shlockはファイルからプロセスIDを読み取り、プロセスが現在実行されているかどうかをテストします。プロセスが存在する場合、ファイルは作成されません。 Shlockは、ロックファイルを作成できた場合はステータスがゼロで終了し、ファイルが現在アクティブなプロセスを参照している場合はゼロ以外で終了します。

3
Rinzwind

cronはps auxを使用してプロセスを検出できません。psCOLUMNSのデフォルトは80です。つまり、psコマンドの出力は80 COLUMNSに切り捨てられます。

ps -aef before column set:
admin    28695     1  0 08:37 ?        00:00:00 /usr/bin/python /home/admin/MyP

ps -aef after column set:
admin    28695     1  0 08:37 ?        00:00:00 /usr/bin/python /home/admin/MyPython/test.py

以下のように列をcrontabに追加すると、問題が修正されます。

以下のcrontab:

Shell=/bin/bash
COLUMNS=160
37 08 * * * /home/admin/MyPython/test.py >>  /home/admin/MyPhon/test.py.log 2>&1 &

test.pyには以下が含まれます。

cmd1="ps -aef >> /home/admin/MyPython/test_ps.txt; echo COLUMNS: ${COLUMNS} ${Shell}>> /home/admin/MyPython/test_ps.txt;"
print cmd1
os.system(cmd1)

うまくいけば答えます。

0
Sree