【问题标题】:Shell script works fine while run separately but fails while scheduling in cron jobShell 脚本在单独运行时工作正常,但在 cron 作业中调度时失败
【发布时间】:2013-11-29 21:42:18
【问题描述】:

我有一个脚本,它在 shell 中运行时运行良好。

但在 cron 作业中安排了相同的脚本时运行不完整或部分运行。 它突然终止

我已将 cron 作业安排为每 15 分钟运行一次。

这是 cronjob 的代码。

0,15,30,45 * * * * /home/convteam/Conversion/update_revenue/RunUpdateRevenue.ksh > /home/convteam/Conversion/update_revenue/RunUpdateRevenue.log

我正在使用名为“convteam”的用户而不是 root 用户来安排作业。

你能帮我解决我在这里缺少的东西吗?

【问题讨论】:

  • Bash 有一个-x 选项,可以在脚本执行时打印调试信息。检查 ksh 是否有类似的东西。然后,在命令行中添加2>&1,观察RunUpdateRevenue.log
  • @VasiliyFaronov - 我会从文件名中假设 OP 没有使用 bash。最好检查一下 ksh 是否有类似的选项。
  • @ghoti 这正是我所说的。我刚刚检查了ksh 联机帮助页,它似乎通过set -x 具有相同的功能。

标签: shell unix cron crontab ksh


【解决方案1】:

这是一个反复出现的问题。 cron 作业失败的最常见原因是:

  1. 关于相对文件路径的假设 - 始终使用完整的绝对文件名

  2. 关于环境的假设。您应该“获取”您所依赖的启动文件,通常(对于 ksh):

    . /etc/profile
    . ~/.profile
    . "$ENV"
    

$ENV 是可选的,但使用时通常具有值~/.kshrc

【讨论】:

  • 感谢您的所有 cmets。
  • 引用脚本中的配置文件解决了问题
【解决方案2】:

crontab 以非登录、非交互模式调用 shell。此模式下的 Bash shell 不会加载通常的启动文件,如 /etc/profile、~/.bash_profile、~/.bash_login、~/.profile、~/.bashrc,这可能会丢失一些重要的环境变量定义,如 PATH。

在 crontab 中运行时,在运行 ksh 脚本之前,您可以通过采购特定的启动文件(/etc/profile、ksh 中的 ~/.profile,如果它们存在且可读)来解决您的问题。您可以“man ksh”查看ksh启动过程的详细信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 1970-01-01
    • 2017-03-09
    相关资源
    最近更新 更多