我有一个简单的 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 脚本配置环境的方式有所不同。