Я выполняю скрипт 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