【问题标题】:running bash script from cron job从 cron 作业运行 bash 脚本
【发布时间】:2019-03-09 09:12:20
【问题描述】:

我有以下脚本:

#!/bin/bash
echo "$(date +"%r")"

if [ "$FOLDER_ID" != "0" ]
then
  node /sync.js -d $FOLDER_ID -l /Downloads
fi

我正在使用 docker 容器,并且在启动容器时我已经传递了环境变量 FOLDER_ID。该变量应该在启动 docker 容器时通过将其作为 ENV 传递来设置。

当我运行此脚本时,节点命令按预期运行,但当 cron 作业运行脚本时,它会打印日期但未正确执行节点命令(我认为问题与 $FOLDER_ID 有关变量)。

有什么建议吗? 谢谢

【问题讨论】:

  • 你从来没有设置FOLDER_ID,它应该来自哪里?
  • Cron 作业不会运行像 .profile.bashrc 这样的 shell 启动脚本,如果这是您通常设置变量的位置。
  • 可以在 crontab 文件中设置环境变量,正如 this answer 所说。
  • Unix & Linux 可能是一个更好的地方来询问如何在 docker 容器中使环境变量成为全局变量。
  • 我让脚本打印了环境,正如您所指出的,cron 环境中似乎缺少一些变量。有没有办法让 cron 作业在与 bash 命令行相同的环境中运行?

标签: linux bash cron


【解决方案1】:

正如一些人在 cmets 中指出的那样,FOLDER_ID 需要设置在某个地方,你是在你的 crontab 行中设置它吗?

您可以尝试调整 crontab 行以使用 bash -x 调用脚本或在脚本顶部附近放置 set -x,这将导致 bash “在执行命令时打印命令及其参数” 。如果您收到来自 cron 的电子邮件,您应该能够查看该电子邮件并找到如下输出:

++ date +%r
+ echo '11:55:41 AM'
11:55:41 AM
+ '[' '' '!=' 0 ']'
+ node /sync.js -d -l /Downloads
...

请注意,以+ 开头的行显示了 bash 即将作为命令执行的内容。

还值得在 ​​bash 脚本开始时使用一些标志来提高严格性,例如:

#!/bin/bash
set -euo pipefail

在这种情况下,-u 标志将导致类似于 line 5: FOLDER_ID: unbound variable 的内容,并且假设 FOLDER_ID 未正确设置,则会导致非零退出状态,有助于突出问题。

P.s 值得在单独的行上使用 set 而不是在 hash bang (#!/bin/bash -euo pipefail) 上,因为将其分开可确保使用 bash -x 进行调试不会意外关闭预期的标志。

【讨论】:

  • 确实是环境变量问题。我让脚本打印了环境,正如您所指出的,cron 环境中似乎缺少一些变量。有没有办法让 cron 作业在与 bash 命令行相同的环境中运行?
  • @ialqwaiz 它永远不会与您在交互式 bash 中的环境完全相同,可能来自多个位置,例如在这种情况下,docker 仅将 env var 传递给入口点命令,而您将必须一直追踪它以确保所有内容都映射完毕 - 更实际地,调整您的入口点以将您关心的 var 存储在 /.env 之类的地方,然后在 bash 脚本顶部的 source /.env 中。
猜你喜欢
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 2013-11-26
  • 1970-01-01
  • 2011-12-05
  • 2020-12-04
  • 2014-11-11
  • 1970-01-01
相关资源
最近更新 更多