为什么手动运行 shell 脚本时得到的输出与使用 cron 运行 shell 脚本时得到的输出不同?

为什么手动运行 shell 脚本时得到的输出与使用 cron 运行 shell 脚本时得到的输出不同?

我有一个相当简单的 shell 脚本 ( foo.sh),如下所示:

#!/bin/bash
echo -n "$USER,$(date)," `binary -flags | sed -e '1,30d'`;
exit 0;

该脚本应该准备一些输出,然后将其附加到文本文件中,如下所示:

foo.sh >> data.csv

当我在 root 提示符下运行上述命令时,它工作正常。但是,当我在我的(根)crontab 中输入完全相同的命令时,如下所示:

05 * * * * /root/foo.sh >> /path/to/data.csv

crontab 输出不同!我没想到会这样,我也不明白为什么。请参阅下面的示例:

Expected, normal output from running my .sh (example):
Fri Jun 14 16:32:34 CEST 2013,20130614163304,268828672,71682561

The output written to the file by cron:
Fri Jun 14 16:32:34 CEST 2013,

.sh 中二进制运行的权限如下所示:

-rwxr-xr-x  1 root root

为什么输出不同?如何将正确的输出放入我的 CSV 文件中?

答案1

你不能指望拥有相同的环境cron在通过交互方式运行的程序中。在这种情况下,有两个差异可能很重要:

  1. 当前工作目录

  2. PATH

如上所述jordanm,其中一项或两项的组合会导致脚本找不到您的binary程序。

如果您查看本地系统邮件(例如通过运行mailx),您可能会发现抱怨此故障的消息。

crontab在编写要运行的条目和脚本时,这是标准做法,cron将路径硬编码到程序的已知位置。

相关内容