私はこのロボット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
問題は:
上記はすべてルートとして作成されているため、ユーザーの問題に関するものではないと思います。
ありがとう
必要なのはロックファイルで、このロックファイルを確認します。存在する場合はスクリプトを終了し、存在しない場合は開始します。
コマンドの例は shlock です。
説明
Shlockは、nameという名前のロックファイルを作成し、プロセスID pidを書き込みます。ファイルがすでに存在する場合、shlockはファイルからプロセスIDを読み取り、プロセスが現在実行されているかどうかをテストします。プロセスが存在する場合、ファイルは作成されません。 Shlockは、ロックファイルを作成できた場合はステータスがゼロで終了し、ファイルが現在アクティブなプロセスを参照している場合はゼロ以外で終了します。
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)
うまくいけば答えます。