当我运行 /bin/bash 脚本时,它运行良好,并记录到脚本中的一些日志文件中。但是,当我从 cron 运行它时,它不会记录到文件中!它只记录到 /var/mail/root ,说
Date: Fri, 12 Aug 2016 08:39:01 +0300 (MSK)
/bin/sh: 1: root: not found
这是脚本:
#!/bin/bash
LOG_FILE="test-crontab.log"
echo "started testing cron" >> ${LOG_FILE}
pgrep tunnel
if [[ ${?} != 0 ]]; then
echo "Tunnel process is not running..." | tee -a ${LOG_FILE}
echo "initializing tunnel..." | tee -a ${LOG_FILE}
/usr/local/bin/stunnel | tee -a ${LOG_FILE} 2>&1
fi
echo `date` >> ${LOG_FILE}
这是 cron:
45 8 * * * /home/ubuntu/sam/scripts/sqlplus-scripts/accts-ct/test-crontab.sh > /dev/null
答案1
要将日志文件放置在您期望的位置,请替换:
LOG_FILE="test-crontab.log"
和:
LOG_FILE="/home/ubuntu/sam/scripts/sqlplus-scripts/accts-ct/test-crontab.log"
该命令
[[ ${?} != 0 ]]
仅适用于 bash。从您引用的错误消息来看,该脚本似乎在 下运行/bin/sh
。修复该问题的一种方法是替换:if [[ ${?} != 0 ]]; then
和:
if [ ${?} != 0 ]; then
另一种方法是运行
crontab -e
并将以下行添加到crontab
文件中:SHELL=/bin/bash
此外,为了简单和风格,请考虑替换:
echo `date` >> ${LOG_FILE}
和:
date >> "${LOG_FILE}"
这消除了无用的回声使用。
最后,考虑为所有 shell 变量加上双引号,特别是
$LOG_FILE
。因为 的当前值LOG_FILE
不包含空格或 shell 活动字符,所以现在不需要这样做。但是,为它们加上双引号将可以防止将来出现不愉快的意外。
答案2
我认为您的 crontab 输入是错误的。
ubuntu crontab 文件的格式是“mh dom mon dow user command”,其中前 5 个条目指定运行作业的时间。第 6 个条目是运行作业的用户(我认为您的条目中缺少这一点),第 7 个条目是您要运行的命令。
我认为你应该将 crontab 行更正为
45 8 * * * 根 /home/ubuntu/sam/scripts/sqlplus-scripts/accts-ct/test-crontab.sh > /dev/null
假设您希望该命令以 root 身份运行
答案3
在我的例子中,工作目录是/home/me
一个相对路径,test-crontab.log
通常被解析为/home/me/test-crontab.log
我不喜欢改变文件路径并降低其可移植性的想法,相反更改 cronjob 行上的目录
cd /path/to/directory && ./bin/myapp