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)
要获取您期望的日志文件,请替换:
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)该命令[[ ${?} != 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)此外,为了简单和风格,请考虑替换:
echo `date` >> ${LOG_FILE}
Run Code Online (Sandbox Code Playgroud)
和:
date >> "${LOG_FILE}"
Run Code Online (Sandbox Code Playgroud)
这消除了无用的回声使用。
最后,考虑在所有 shell 变量周围加上双引号,特别是$LOG_FILE
. 因为当前值不LOG_FILE
包含空格或 shell-active 字符,所以现在不需要。但是,在它们周围加上双引号将防止将来出现令人不快的意外。