我有一个脚本停止应用程序并压缩一些文件:
/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
(工作)
请帮忙
答案 0 :(得分:0)
在cron
下运行时脚本失败,因为您的脚本在其路径中调用了project
,因此kill
管道也会杀死脚本。
您可以通过添加一些跟踪来证明(或反驳)这一点。将ps
和awk
的输出记录到日志文件中:
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
从命令行,就像使用cron
(crontab
)一样,你会发现它失败了。