我通过 执行了一个 Python 脚本cron
。该脚本从开头就包含许多打印语句(第一行是打印语句)。但是,即使脚本正在运行,也会创建日志文件,但该文件仍为空白。
这是我的 crontab:
00 14 * * * python DE.py >> DElog.log 2>&1
有人知道为什么吗?
答案1
耐心是一种美德。
首先,日志文件在脚本开始运行和生成输出之前就被创建了。
其次,在 Linux 上,当标准输出重定向到 TTY(终端窗口)以外的其他位置时,输出将默认完全缓冲,而不是行缓冲。
因为您还将标准错误重定向到 stdout(使用2>&1
),所以不会将任何输出写入磁盘,直到:
- 您的脚本完成
或
- 输出超出默认缓冲区大小(4k?)。
您可以使用以下方式调整缓冲stdbuff
并使错误和输出模式无缓冲:
stdbuf -o0 -e0 python DE.py >> DElog.log 2>&1
答案2
日志文件存在并且是空白的,因为它是由 shell 打开的,甚至在脚本运行之前。
看:
$ 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 shell,
>> DElog.log 2>&1
可以简化为
&>> DElog.log