为什么部分脚本无法在crontab中执行

时间:2014-07-30 03:28:09

标签: linux shell cron

我有一个脚本停止应用程序并压缩一些文件:

/home/myname/project/stopWithZip.sh

使用以下属性:

-rwxrwxr-x. 1 myname myname778 Jun 25 13:48 stopWithZip.sh

以下是脚本的内容:

ps -ef | grep project | grep -v grep | awk '{print $2}' |xargs kill -15

month=`date +%m`
year=`date +%Y`

fixLogs=~/project/log/fix/$year$month/*.log.*
errorLogs=~/project/log/error/$year$month/log.*

for log in $fixLogs
do
  if [ ! -f "$log.gz" ];
  then
    gzip $log
    echo "Archived:"$log
  else
    echo "skipping" $log
  fi
done
echo "Archived fix log files done"


for log in $errorLogs
do
  if [ ! -f "$log.gz" ]; then
    gzip $log
    echo "Archived:"$log
  else
    echo "skipping" $log
  fi
done
echo "Archived errorlog files done"

问题是除了ps -ef | grep project | grep -v grep | awk '{print $2}' |xargs kill -15命令之外,其他gzip命令都没有执行。我完全不明白为什么。

我看不到目录中日志的任何压缩。

BTW,当我在命令行中显式执行stopWithZip.sh时,它完全正常。

在crontab中:

00 05 * * 2-6 /home/myname/project/stopWithZip.sh >> /home/myname/project/cronlog/$(date +"\%F")-stop.log 2>&1(不工作)

在命令行中:

/home/myname/project>./stopWithZip.sh(工作)

请帮忙

1 个答案:

答案 0 :(得分:0)

cron下运行时脚本失败,因为您的脚本在其路径中调用了project,因此kill管道也会杀死脚本。

您可以通过添加一些跟踪来证明(或反驳)这一点。将psawk的输出记录到日志文件中:

ps -ef |
tee /tmp/ps.log.$$ |
grep project |
grep -v grep |
awk '{print $2}' |
tee /tmp/awk.log.$$ |
xargs kill -15

查看日志并查看您的脚本是被杀死的进程之一。


crontab条目包含:

/home/myname/project/stopWithZip.sh >> /home/myname/project/cronlog/$(date +"\%F")-stop.log 2>&1

ps列出时,它包含'project'且不包含'grep',因此脚本中的kill会杀死脚本本身。

当您从命令行运行它时(使用传统的“$”作为提示),您运行:

$ ./stopWithZip.sh 

ps列出时,它不包含“项目”,因此不会被杀死。

如果你跑了:

$ /home/myname/project/stopWithZip.sh >> /home/myname/project/cronlog/$(date +"\%F")-stop.log 2>&1
从命令行

,就像使用croncrontab)一样,你会发现它失败了。