Скрипт Python не запускает фоновый процесс при вызове cron

У меня есть скрипт 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'

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

0x01 14.03.2018 12:27

Вы пытались указать полный путь к исполняемому файлу python в команде cron. например / usr / bin / python.

Axeon Thra 14.03.2018 12:27

@ 0x01 в коде, так как вы можете видеть, что используется его путь abs

Alex Petrov 14.03.2018 12:29

@AxeonThra, ничего особенного не меняется.

Alex Petrov 14.03.2018 12:33

«файл» - это параметр функции, и не показано, как функция вызывается.

0x01 14.03.2018 12:33

Этот подход не будет работать, даже если он нет вызывается cron. Это должен быть subprocess.call(['chmod', '+x', '--', file]), а не subprocess.call('chmod +x %s' % file). Последнее не только ошибочно, но и небезопасно (как и ваш код os.system()) - вредоносное имя файла может заставить ваш скрипт запускать произвольные команды.

Charles Duffy 14.03.2018 14:55

Как бы то ни было, в Python есть встроенная функция os.chmod(). Используй это.

Charles Duffy 14.03.2018 14:55

... другая проблема, связанная с тем, что будут поддерживает только cron, - это отсутствие (в некоторых системах) PATH по умолчанию. Убедитесь, что вы указали PATH=/bin:/usr/bin:/usr/local/bin или что-то подобное в верхней части вашего crontab (это может быть в отдельной строке, чтобы применяться ко всем записям под ним).

Charles Duffy 14.03.2018 14:56

@AlexPetrov, если вы не устанавливаете переменную PATH, не только вызов сценария должен иметь абсолютный путь на питон, но и его вызов chmod требует абсолютного пути chmod. Таким образом, я считаю, что вы неправильно поняли то, что вам говорил AxeonThra.

Charles Duffy 14.03.2018 14:58

См. вики-страница с информацией о тегах cron, который здесь подробно описывает.

Charles Duffy 14.03.2018 15:02

@CharlesDuffy Я уже упоминал, что при ручном запуске все работает нормально, проблема только тогда, когда скрипт, запущенный cron, пытается запустить программу в фоновом режиме.

Alex Petrov 14.03.2018 15:26

@AlexPetrov, да, и PATH будет настроен на разумное значение, когда вы запустите свою программу вручную. Только от cron по умолчанию пусто. Пожалуйста, перестаньте пытаться найти причины, по которым ваш совет не применим, а вместо этого следуй этому совету.

Charles Duffy 14.03.2018 15:47

Я бы также посоветовал 2>/path/to/logfile или что-то подобное для сбора фактического сообщения об ошибке.

Charles Duffy 14.03.2018 15:48

@CharlesDuffy cron на самом деле запускает скрипт python, но программа, которая была запущена скриптом в фоновом режиме, не работает и не работает в списке процессов, выглядящих как «/ usr / bin / python / home / alex / exec / runnable». Итак, скрипт работает нормально, но не запускает программу в фоновом режиме.

Alex Petrov 14.03.2018 15:50

@AlexPetrov, да, но скрипт Python наследует переменную среды PATH от crond, поэтому, когда он пытается запустить chmod, он может найти его только в том случае, если он находится в PATH, который был у cron. Прекратите спорить (если бы вы уже все знали об этой теме, вы бы здесь не задавали вопросов) и попробуйте следовать совету, который вам дают.

Charles Duffy 14.03.2018 16:01

(И измените >/dev/null & на >/tmp/cron.log 2>&1 & или что-то подобное, чтобы вы фактически получили файл журнала, показывающий точную ошибку, которую вы можете указать в вопросе редактировать).

Charles Duffy 14.03.2018 16:02
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
16
157
0

Другие вопросы по теме