crontab 中的 shell 脚本,并非所有输出都被记录

crontab 中的 shell 脚本,并非所有输出都被记录

我有一个简单的 shell 脚本,可以运行一些 LFTP 命令并处理文件。
当直接从 bash 运行时,我会在屏幕上获得这些 LFTP 命令的完整输出。

当使用以下命令从 crontab 运行时...
*/5 * * * * /bin/bash /home/user/ftp-getter.sh >> /var/log/ftp-getter.log 2>&1
我仅获得明确回显某些输出的行的输出和date命令的输出。LFTP 返回的文本不会进入日志。

我尝试将移至2>&1之前>>但仍然得到相同的结果。

当直接从命令行运行该 crontab 命令时,我确实会在屏幕上和日志文件中看到 LFTP 输出。但在 crontab 中运行时则不会。

LFTP 的输出是否有一些特殊之处会导致这种情况,并且可能适用于从 crontab 中的 shell 脚本运行时的其他命令?

答案1

lftp可能正在使用除 STDOUT 和 STDERR 之外的文件描述符。通过运行以下命令进行检查:strace

strace lftp ...

并查找以“write”开头的行:

write(3, ...

该数字是程序写入的描述符。同时重定向该描述符。

... >> /var/log/ftp-getter.log 2>&1 3>&1

答案2

从 crontab 重定向应该可行,但您可以尝试的另一种方法是在脚本中使用 exec 来重定向所有输出。在脚本开头像这样使用它:

exec 1>> /var/log/ftp-getter.log 2>&1

现在您不需要明确重定向脚本中各个命令的输出。

答案3

这个对我有用

*/5 * * * * screen -dmS ftp-getter /bin/bash /home/user/ftp-getter.sh >> /var/log/ftp-getter.log 2>&1

答案4

有些事情在 cron 中不起作用,但在 shell 会话中可以起作用,一个常见的原因是环境差异。

比较从 cron 运行和从 shell 运行的输出env。回想一下,从 cron 启动的 shell 是非交互式的,这可能会导致您的 init 脚本配置环境的方式有所不同。

相关内容