У меня есть этот робот 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 минут с помощью этой команды:
cd /path/to/boot && if [ 2 -gt `ps aux | grep worker.py | wc -l` ]; then python worker.py --detail &> /dev/null ; fi
проблема:
Все выше сделано как root, так что, я полагаю, речь идет не о проблемах пользователей.
Спасибо
То, в чем Вы нуждаетесь, является файлом блокировки и проверкой на этот файл блокировки. Если это - там конец, сценарий иначе запускает его.
команда в качестве примера была бы халтура .
ОПИСАНИЕ
Shlock пытается создать файл блокировки, названный именем и записать идентификационный pid процесса в него. Если файл уже будет существовать, то халтура прочитает идентификатор процесса из файла и протестирует, чтобы видеть, работает ли процесс в настоящее время. Если процесс будет существовать, то файл не будет создан. Shlock выходит с нулевым состоянием, если он смог создать файл блокировки, или ненулевой, если файл относится к в настоящее время активному процессу.
крон не может найти процесс с PS aux, значение по умолчанию СТОЛБЦОВ PS равняется 80. т.е. вывод команды PS является усеченным к 80 СТОЛБЦАМ.
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)
, Надо надеяться, это отвечает.