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

Sam*_*Sam 4 bash scripts cron 14.04

当我运行 /bin/bash 脚本时,它运行良好,并记录到脚本内的一些日志文件中。但是,当我从 cron 运行它时,它不会记录到文件中!它只记录到 /var/mail/root ,说

Date: Fri, 12 Aug 2016 08:39:01 +0300 (MSK)

/bin/sh: 1: root: not found
Run Code Online (Sandbox Code Playgroud)

这是脚本:

#!/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}
Run Code Online (Sandbox Code Playgroud)

这是cron:

45 8 * * *  /home/ubuntu/sam/scripts/sqlplus-scripts/accts-ct/test-crontab.sh > /dev/null
Run Code Online (Sandbox Code Playgroud)

Joh*_*024 5

  1. 要获取您期望的日志文件,请替换:

    LOG_FILE="test-crontab.log"
    
    Run Code Online (Sandbox Code Playgroud)

    和:

    LOG_FILE="/home/ubuntu/sam/scripts/sqlplus-scripts/accts-ct/test-crontab.log"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 该命令[[ ${?} != 0 ]]仅用于 bash。根据您引用的错误消息,脚本似乎在/bin/sh. 解决此问题的一种方法是替换:

    if [[ ${?} != 0 ]]; then
    
    Run Code Online (Sandbox Code Playgroud)

    和:

    if [ ${?} != 0 ]; then
    
    Run Code Online (Sandbox Code Playgroud)

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

    SHELL=/bin/bash
    
    Run Code Online (Sandbox Code Playgroud)
  3. 此外,为了简单和风格,请考虑替换:

    echo `date` >> ${LOG_FILE}
    
    Run Code Online (Sandbox Code Playgroud)

    和:

    date >> "${LOG_FILE}"
    
    Run Code Online (Sandbox Code Playgroud)

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

  4. 最后,考虑在所有 shell 变量周围加上双引号,特别是$LOG_FILE. 因为当前值不LOG_FILE包含空格或 shell-active 字符,所以现在不需要。但是,在它们周围加上双引号将防止将来出现令人不快的意外。