Назад | Перейти на главную страницу

Cron не записывает в журнал мгновенно в Ubuntu

Я выполняю скрипт Python через cron. Сценарий содержит множество операторов печати с самого начала (первая строка - это печать). Однако даже если сценарий выполняется, файл журнала создается, но остается пустым.

Вот мой crontab:

00 14 * * * python DE.py >> DElog.log 2>&1

Кто-нибудь знает, почему?

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

Видеть:

    $ rm log
rm: log: No such file or directory
    $ thatdoesnotexist > log
-bash: thatdoesnotexist: command not found
    $ ls log
log

Так что ваш скрипт, вероятно, вообще не запускается.

Во-первых, для crontab всегда указывайте полный путь. Так что вместо

python DE.py

поставить что-то вроде (путь конечно поправить)

python /usr/local/bin/DE.py

То же самое для файла журнала: укажите его полный путь.

Теперь вы не указали, что это за crontab, какой пользователь? Как вы попали в эти строки? Потому что вам нужно будет убедиться, что у пользователя, под которым будет выполняться эта команда, есть достаточные права. Ему потребуется доступ для чтения, чтобы прочитать файл python и выполнить его, а затем ему потребуется доступ для записи в путь к файлу журнала, чтобы иметь возможность писать в него.

Это первый шаг, который вам нужно исправить.

Кроме того, переданный совет: с оболочкой bash,

 >> DElog.log 2>&1

можно упростить до

&>> DElog.log

Терпение - это добродетель.

Во-первых, файл журнала создается первым, даже до того, как скрипт начнет работать и генерировать выходные данные.

Во-вторых, в Linux, когда стандартный вывод перенаправляется на что-то другое, кроме TTY (окно терминала), вывод будет полностью буферизован по умолчанию, а не строковой.

Поскольку вы также перенаправляете стандартную ошибку на стандартный вывод (с 2>&1) вывод на диск не будет записываться до тех пор, пока:
- либо ваш скрипт завершится
или
- вывод превышает размер буфера по умолчанию (4 КБ?).

Вы можете настроить буферизацию с помощью stdbuff и сделать режимы ошибок и вывода небуферизованными:

stdbuf -o0 -e0 python DE.py >> DElog.log 2>&1