cron 不运行 bash 作业

cron 不运行 bash 作业

所以我看到了一些非常奇怪但也许很简单的东西?但不够简单,我无法弄清楚。我编写了一个简单的 bash 脚本,我可以正常运行而不会出现问题,当我安排一个 cron 作业然后不运行我的脚本时,问题就出现了。

该脚本是可执行的,可以手动执行该脚本而不会出现错误/问题。我尝试使用以下命令将其添加到 crontab 中:

# crontab -l
  30 * * * * /usr/scripts/test_script.sh

我还尝试在下面添加一个文件/etc/cron.d/test_script并尝试指定路径和外壳:

# cat /etc/cron.d/tes_script
PATH=/bin:/usr/bin:/sbin:/usr/sbin
SHELL=/bin/bash
30 * * * * /usr/scripts/test_script.sh

我一直在尝试检查日志,tailf /var/log/syslog并看到以下内容:

2 月 7 日 10:53:01 CRON[29203]: (root) CMD (/usr/scripts/test_script.sh)

所以看起来它可能正在运行,但实际上并非如此(它触发了一个更新过程,可以在程序的 Web 界面上看到)。

有什么我可能遗漏的吗?这是脚本

#!/bin/bash
DIST="ubuntu"
LOGS="/var/logs/test_script.log"
RECIPIENTS="[email protected]"
declare -a POCKET=("release" "security" "updates")

xenial()
{
SERIES="xenial"
for pocket in "${POCKET[@]}"
do
        bzip2 -d "$HOLDER"*.bz2
        sync-pocks "$pocket" "$SERIES" "$DIST"
        sleep 5m
done
return 0
}

precise()
{
SERIES="precise"
for pocket in "${POCKET[@]}"
do
        bzip2 -d "$HOLDER"*.bz2
        sync-pocks "$pocket" "$SERIES" "$DIST"
        sleep 5m
done
return 0
}

xenial &> "$LOGS" &&
precise &>> "$LOGS" ||
cat "$LOGS" | mailx -s "Sync" "$RECIPIENTS"

脚本中可能存在语法问题吗?如果是这样,为什么手动运行时会没有问题?

答案1

这些是基于您的代码的一些疯狂猜测:

  1. 你的文件在哪个目录"$HOLDER"*.bz2?我cd在你的脚本中没有看到任何命令。可能该脚本是在错误的目录。
  2. $HOLDER变量未定义。
  3. sync-pocks在你的道路上吗?

答案2

当 cron 运行它时,它会使用“sh”shell 执行,而该 shell 不支持该&>语法。它可以与您为 /etc/cron.d/tes_script 设置的 SHELL 语法正常工作,但 /etc/cron.d 中的文件需要不同的语法(将用户名添加为字段),而您没有使用该语法。

要修复它,请SHELL=/bin/bash在您自己的 crontab 中设置。

答案3

很晚了,但我找到了解决方案:使用 -l 选项运行脚本。由于我在登录 shell 上设置的变量,cronjob 将不会运行,也不会记录任何错误。根据手册页:

-l 使 bash 的行为就像它已作为登录 shell 被调用一样(请参阅下面的 INVOCATION)。

所以我的 crontab 看起来像这样:

30 * * * * /usr/scripts/test_script.sh

相关内容