我有一个简单的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脚本运行?
lftp可能使用除STDOUT和STDERR之外的文件描述符。 通过在strace运行命令来检查
strace lftp ...
并寻找以“写”开始的行:
write(3, ...
数字是程序写入的描述符。 redirect该描述符。
... >> /var/log/ftp-getter.log 2>&1 3>&1
从crontabredirect应该可以工作,但另一种可以尝试的方法是在脚本中使用exec来redirect所有输出。 在脚本的开始处像这样使用它:
exec 1>> /var/log/ftp-getter.log 2>&1
现在,您不需要在脚本中显式redirect单个命令的输出。
这个对我有用
*/5 * * * * screen -dmS ftp-getter /bin/bash /home/user/ftp-getter.sh >> /var/log/ftp-getter.log 2>&1
在cron中不起作用,但在shell会话中工作的常见原因是环境的差异。
比较从cron和shell运行时的env输出。 回想一下,从cron启动的shell是非交互式的,这可能会导致init脚本configuration环境的方式不同。