从 cron 执行时脚本不会写入文件

从 cron 执行时脚本不会写入文件

当我运行 /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

  1. 要将日志文件放置在您期望的位置,请替换:

    LOG_FILE="test-crontab.log"
    

    和:

    LOG_FILE="/home/ubuntu/sam/scripts/sqlplus-scripts/accts-ct/test-crontab.log"
    
  2. 该命令[[ ${?} != 0 ]]仅适用于 bash。从您引用的错误消息来看,该脚本似乎在 下运行/bin/sh。修复该问题的一种方法是替换:

    if [[ ${?} != 0 ]]; then
    

    和:

    if [ ${?} != 0 ]; then
    

    另一种方法是运行crontab -e并将以下行添加到crontab文件中:

    SHELL=/bin/bash
    
  3. 此外,为了简单和风格,请考虑替换:

    echo `date` >> ${LOG_FILE}
    

    和:

    date >> "${LOG_FILE}"
    

    这消除了无用的回声使用。

  4. 最后,考虑为所有 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

相关内容