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

Linux 为什么部分脚本无法在crontab中执行,linux,shell,cron,Linux,Shell,Cron,我有一个脚本停止应用程序并压缩一些文件: /home/myname/project/stopWithZip.sh 具有以下属性: -rwxr-x。1我的名字我的名字778 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/l

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

/home/myname/project/stopWithZip.sh

具有以下属性:

-rwxr-x。1我的名字我的名字778 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命令都没有执行。我完全不明白为什么

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

顺便说一句,当我在命令行中显式执行
stopWithZip.sh
时,它工作得非常好

在crontab中:

00 05**2-6/home/myname/project/stopWithZip.sh>/home/myname/project/cronlog/$(日期+“\%F”)-stop.log 2>&1
(不起作用)

在命令行中:

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


请帮助在
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
列出它时,它不包含“project”,因此不会被终止

如果您运行:

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

从命令行,就像您使用
cron
crontab
)一样,您会发现它失败了。

Plz请查看我的更新:当我在命令行中显式执行
stopWithZip.sh
时,它工作得非常好。显示crontab条目并显示命令行(将它们编辑到问题中-请不要在此处添加它们作为评论)。然后我将向您展示为什么一个有效,而另一个无效(或者让您知道我没有解释)但我相信,使用crontab条目和命令行,解释会很简单。您的“命令行”显示为:
/home/myname/project>/stopWithZip.sh
,我认为必须将其解释为“当前目录为
/home/myname/project
,并且
标记提示的结束,因此命令正在运行的只是
/stopWithZip.sh
,这是一个不包含
项目的名称,因此它可以工作。如果运行
$PWD/stopWithZip.sh
(更接近模拟
cron
的功能),您会发现它失败了。请参阅我对答案的更新,其中说明了大致相同的内容。就我个人而言,我的提示总是以空白结尾,并且通常在其前面加一个
(例如,在我的机器“osiris”上,我的提示是“
osiris JL:
”)。我不喜欢回显当前目录;我在路径名几乎与100列屏幕一样宽的目录中工作,而且将命令打印在屏幕的右边距会让我感到厌烦。因此,我总是将提示设置为合理、简短,并以空格结尾。我现在明白你的答案了。将zip操作作为单独的命令放在crontab中是否更容易?