为什么在crontab中调用时使用set -e导致我的脚本失败?

时间:2010-05-19 23:27:56

标签: bash scripting crontab

我有一个执行多个文件操作的bash脚本。当任何用户运行此脚本时,它会成功执行并输出几行文本,但是当我尝试cron它时会出现问题。它似乎运行(我看到cron日志中的一个条目显示它已被启动)但没有任何反应,它不输出任何内容,也不执行任何文件操作。它也不会出现在正在运行的进程中,因此它似乎立即退出。

经过一些故障排除后我发现删除“set -e”解决了这个问题,它现在从系统cron运行没有问题。所以它可以工作,但我宁愿设置启用-e,以便在出现错误时退出脚本。有谁知道为什么“set -e”导致我的脚本退出?

谢谢你的帮助,
莱恩

2 个答案:

答案 0 :(得分:4)

当您的脚本在cron下运行时,环境变量和路径的设置可能与用户直接运行脚本时的设置不同。也许这就是它表现不同的原因?

要对此进行测试:创建一个除printenvecho $PATH之外什么也不做的新脚本。 手动运行此脚本,保存输出,然后将其作为cron作业运行,保存该输出。 比较两种环境。我相信你会发现差异......互动 登录shell将通过获取“.login”,“。bash_profile”来设置其环境, 或类似的脚本(取决于用户的shell)。这通常不会发生在 cron job,这通常是cron作业与运行不同的原因 登录shell中的相同脚本。

要解决此问题:在脚本的顶部,显式设置环境变量 和PATH匹配交互式环境,或者来源用户的“.bash_profile”, “.login”或其他安装脚本,具体取决于他们使用的是哪个shell。

答案 1 :(得分:4)

使用set -e,脚本将在第一个命令处停止,该命令提供非零退出状态。这并不一定意味着您将看到错误消息。

以下是一个示例,使用false命令除了以错误状态退出之外什么都不做。

没有set -e

$ cat test.sh
#!/bin/sh

false
echo Hello

$ ./test.sh
Hello
$

但是set -e的相同脚本退出而没有打印任何内容:

$ cat test2.sh
#!/bin/sh

set -e

false
echo Hello

$ ./test2.sh
$ 

根据您的观察,听起来您的脚本由于某种原因(可能与Jim Lewis建议的不同环境有关)在生成任何输出之前失败。

要进行调试,请将set -x添加到脚本的顶部(以及set -e),以便在执行时显示命令。