У меня есть скрипт python, запущенный cron:
"*/5 * * * * python /home/alex/scripts/checker > /dev/null &";
У него несколько целей, одна из них - проверять определенные программы в списке ps и запускать их, если их там нет. Проблема в том, что скрипт при запуске cron не запускает программы в фоновом режиме правильно, все они в списке ps выглядят так:
/usr/bin/python /home/alex/exec/runnable
Так они выглядят как скрипты Python. Когда я запускаю свой скрипт python вручную, кажется, что он правильно работает в фоновом режиме, но с cron ничего не работает.
Вот пример кода:
def exec(file):
file = os.path.abspath(file)
os.system("chmod +x " + file)
cmd = file
#os.system(cmd)
#subprocess.Popen([cmd])
subprocess.call([cmd])
Я пробовал разные подходы, но ничего не работает.
Some code update:
pids = get_pids(program)
if pids == None:
exec(program)
print 'Restarted'
Вы пытались указать полный путь к исполняемому файлу python в команде cron. например / usr / bin / python.
@ 0x01 в коде, так как вы можете видеть, что используется его путь abs
@AxeonThra, ничего особенного не меняется.
«файл» - это параметр функции, и не показано, как функция вызывается.
Этот подход не будет работать, даже если он нет вызывается cron. Это должен быть subprocess.call(['chmod', '+x', '--', file]), а не subprocess.call('chmod +x %s' % file). Последнее не только ошибочно, но и небезопасно (как и ваш код os.system()) - вредоносное имя файла может заставить ваш скрипт запускать произвольные команды.
Как бы то ни было, в Python есть встроенная функция os.chmod(). Используй это.
... другая проблема, связанная с тем, что будут поддерживает только cron, - это отсутствие (в некоторых системах) PATH по умолчанию. Убедитесь, что вы указали PATH=/bin:/usr/bin:/usr/local/bin или что-то подобное в верхней части вашего crontab (это может быть в отдельной строке, чтобы применяться ко всем записям под ним).
@AlexPetrov, если вы не устанавливаете переменную PATH, не только вызов сценария должен иметь абсолютный путь на питон, но и его вызов chmod требует абсолютного пути chmod. Таким образом, я считаю, что вы неправильно поняли то, что вам говорил AxeonThra.
См. вики-страница с информацией о тегах cron, который здесь подробно описывает.
@CharlesDuffy Я уже упоминал, что при ручном запуске все работает нормально, проблема только тогда, когда скрипт, запущенный cron, пытается запустить программу в фоновом режиме.
@AlexPetrov, да, и PATH будет настроен на разумное значение, когда вы запустите свою программу вручную. Только от cron по умолчанию пусто. Пожалуйста, перестаньте пытаться найти причины, по которым ваш совет не применим, а вместо этого следуй этому совету.
Я бы также посоветовал 2>/path/to/logfile или что-то подобное для сбора фактического сообщения об ошибке.
@CharlesDuffy cron на самом деле запускает скрипт python, но программа, которая была запущена скриптом в фоновом режиме, не работает и не работает в списке процессов, выглядящих как «/ usr / bin / python / home / alex / exec / runnable». Итак, скрипт работает нормально, но не запускает программу в фоновом режиме.
@AlexPetrov, да, но скрипт Python наследует переменную среды PATH от crond, поэтому, когда он пытается запустить chmod, он может найти его только в том случае, если он находится в PATH, который был у cron. Прекратите спорить (если бы вы уже все знали об этой теме, вы бы здесь не задавали вопросов) и попробуйте следовать совету, который вам дают.
(И измените >/dev/null & на >/tmp/cron.log 2>&1 & или что-то подобное, чтобы вы фактически получили файл журнала, показывающий точную ошибку, которую вы можете указать в вопросе редактировать).






"Файл" передается с абсолютным или относительным путем? Попробуйте использовать абсолютный путь.