Python подпроцесс с crontab - PullRequest
       0

Python подпроцесс с crontab

1 голос
/ 27 января 2020

Я пытаюсь запустить test.py каждую минуту, используя crontab, который вызывает (после некоторых других функций) test2.py с параметром. Когда я запускаю «python3 test.py» в терминале, я вижу test2.py в диспетчере задач. Когда я использую crontab, это не так. Test.py работает, как я вижу вывод в терминале. Все файлы находятся в /root/.

Crontab:

PATH=/root
* * * * * /usr/bin/flock -n /tmp/5.lockfile /usr/bin/python3 /root/test.py > /dev/pts/3

Test.py:

import subprocess
import os
import time

print(os.environ['PATH']) #Gives \root

#Three different methods, doesn't work:
subprocess.call("python3 /root/test2.py 1", shell=True) 
subprocess.Popen("python3 test2.py 1", stdout=subprocess.PIPE, shell=True, preexec_fn=os.setsid)
os.system("test2.py 1")

time.sleep(30)

1 Ответ

0 голосов
/ 28 января 2020

Возможно, что python3 не в пути для пользователя, который запускает crontab. Таким образом, вы должны сделать свой сценарий более надежным.

Вы можете не использовать shell=True и строковую командную строку: это плохая практика и приводит к проблемам (например, с цитированием, а также к проблемам безопасности)

Что-то, что будет работать независимо от того, какой системный путь будет использовать sys.executable для поиска текущего интерпретатора и создания аргумента list , чтобы избежать будущих проблем, например, с аргументами, содержащими специальные символы:

subprocess.call([sys.executable,"/root/test2.py","1"])

sys.executable - это полный путь к интерпретатору, на котором в данный момент выполняется скрипт, поэтому его обязательно найдут. Остальные аргументы не зависят от пользователя (кроме разрешений)

Также, возможно, проверьте код возврата subprocess.call или, если вызов должен быть успешным, замените на subprocess.check_call.

Другим способом было бы импортировать test2 и вызывать один, если его функции. Это не создает другой процесс, но это, вероятно, не имеет значения, и у него есть преимущества (например: позволяет возвращать python типов, не прерывая цепочку исключений…)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...