所以我看到了一些非常奇怪但也许很简单的东西?但不够简单,我无法弄清楚。我编写了一个简单的 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
这些是基于您的代码的一些疯狂猜测:
- 你的文件在哪个目录
"$HOLDER"*.bz2
?我cd
在你的脚本中没有看到任何命令。可能该脚本是在错误的目录。 $HOLDER
变量未定义。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