Как отладить сценарий python, выполняемый crontab? - PullRequest
0 голосов
/ 08 мая 2020

В настоящее время у меня есть сценарий python, который имеет следующую структуру

read_data()
    print("debugging statement 1")
    # random code 

plot_data(data)
    print("debugging statement 2")
    #random code 

if __name__ == '__main__':
   var = "test1"
   var2 = "test2"
   data_organized = read_data(var,var2)
   print("debugging statement 3")
   plot_data(data_organized)

   .....rest of code ..... 

I s sh в raspberry pi, и с терминала я могу написать:

/full/path/to/env/python3 /full/path/to/script.py 

и скрипт выполняет совершенно без ошибок.

Я поместил его в crontab, чтобы запускать его каждую минуту со следующим crontab

*/1 * * * * /full/path/to/env/bin/python3 /full/path/to/script/script.py >> /random/path/to/where/i/want/output/cron_log.txt 2>&1

, но код python выдает ошибку. когда я проверяю свой файл cron_log.txt, я вижу, что ошибка произошла где-то в функции read_data (), потому что я вижу, что вывод print ("отладочный оператор 3) не соответствует тому, что должен быть. Но я не вижу никакой печати операторы, которые находятся внутри функции read_data ().

вопросы:

1.) почему код работает идеально, когда я запускаю его напрямую, но когда я запускаю его с помощью crontab, он выдает ошибка?

2.) верна ли моя запись в crontab? Я хочу, чтобы она запускалась каждую минуту

3.) как я могу записать вывод функций print () в read_data () , функции plot_Data ()? в настоящее время я могу видеть только print (debugging3) в моем выходном файле.

Ответы [ 3 ]

0 голосов
/ 08 мая 2020

Наиболее вероятная причина ошибки - проблема с разрешениями. (см. это https://unix.stackexchange.com/questions/81805/what-are-the-runtime-permissions-of-a-cron-job)

Для отладки процесса вы могли бы использовать такой инструмент, как remote_pdb , а затем пошагово выполнить ваш скрипт.

0 голосов
/ 08 мая 2020

Отвечая на ваши вопросы:

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

  2. , что кажется нормальным .

  3. ваш скрипт ломается в read_data(), как только вы исправите это, вы увидите результат отладки

Наконец, почему это происходит не работает и как исправить. Поскольку вы не предоставили никаких значимых источников, я бы сказал, что ваша функция read_data() пытается получить доступ к некоторым файлам данных, используя относительные пути, и терпит неудачу, поскольку сценарий выполняется из другой папки. Вы должны убедиться, что все пути являются абсолютными и установлены разрешения для доступа к этим файлам.

0 голосов
/ 08 мая 2020

Попробуйте что-то подобное в другом скрипте, который вызовет ваш script.py

#!/usr/bin/env python
# You can name me: logger.py
import subprocess
with open("output.txt", "w+") as output:
    subprocess.call(["python", "./script.py"], stdout=output);
...