LINUX.ORG.RU
решено ФорумAdmin

python-скрипт не работает в cron?

 , , ,


0

0

Python скрипт не работает в crontab. Запускаюсь на сервере Debian. Из библиотек внутри скрипта использую: subprocess, os, requests, json, datetime

Выполняю crontab -e -u root

*/2 * * * * python /access-sync/role.py >> /access-sync/test.log 2>&1

После добавления 2>&1 начал фиксировать ошибки в test.log, но ошибок быть не должно, т.к. если запустить с консоли python access-sync/role.py >> /access-sync/test.log то всё корректно отрабатывает.

Пробовал изменять crontab:

*/2 * * * * export PYTHONPATH=/usr/bin/python3 && export PATH=$PATH:/usr/lib/python3 && /usr/bin/python3 /access-sync/role.py >> /access-sync/test.log 2>&1

Работает идентично.

Зафиксированные ошибки при работе скрипта по cron’у:

Traceback (most recent call last):
  File "/access-sync/role.py", line 299, in <module>
    main()
  File "/access-sync/role.py", line 12, in main
    users_to_add = check_users(get_info)
  File "/access-sync/role.py", line 61, in check_users
    result = subprocess.run(['p4', 'users'], capture_output=True, text=True)
  File "/usr/lib/python3.9/subprocess.py", line 505, in run
    with Popen(*popenargs, **kwargs) as process:
  File "/usr/lib/python3.9/subprocess.py", line 951, in __init__
    self._execute_child(args, executable, preexec_fn, close_fds,
  File "/usr/lib/python3.9/subprocess.py", line 1823, in _execute_child
    raise child_exception_type(errno_num, err_msg, err_filename)
FileNotFoundError: [Errno 2] No such file or directory: 'p4'

Перемещено hobbit из general



Последнее исправление: spitefuldragon (всего исправлений: 7)
Ответ на: комментарий от gruy

при запуске внутри скрипта ‘‘‘/usr/local/bin/p4 users’’’ проблема пропадает, но нужно использовать просто ‘‘‘p4 users’’’, т.к. этот путь ‘‘‘/usr/local/bin/’’’ на разных хостах разный. На другом хосте crontab */2 * * * * python /access-sync/role.py >> /access-sync/test.log 2>&1 работает как и должен работать

spitefuldragon
() автор топика
Ответ на: комментарий от gruy

Указал export PATH=$PATH:/usr/local/bin/ в crontab

*/2 * * * * export PATH=$PATH:/usr/local/bin/ && python /access-sync/role.py >> /access-sync/test.log 2>&1

Результат есть как при работе из консоли. Спасибо.

А где необходимо править crontab, чтоб не указывать export PATH=$PATH:/usr/local/bin/ в явном виде?

На другом хосте работает без этой записи

spitefuldragon
() автор топика
Ответ на: комментарий от spitefuldragon

А где необходимо править crontab, чтоб не указывать export PATH=$PATH:/usr/local/bin/ в явном виде?

Лучше не надо. Отсутствие /usr/local/bin это дефолт в очень многих дистрах, будешь потом опять гадать почему на другом хосте ровно такая же строка в crontab не работает. Пусть лучше будет явно указано. Оно конечно уродливо смотрится, но за то меньше путаницы

MrClon ★★★★★
()

2>&1 должно быть до перенаправления, а не после. попробуй ещё вот так:

*/2 * * * * python /access-sync/role.py 2>&1|tee -a /access-sync/test.log

если через ансибл, то тем более такая конструкция надёжнее. модуль: shell

flant ★★★★
()
Последнее исправление: flant (всего исправлений: 1)