2014-10-27 170 views
1

我有一个bash脚本,我已经写出来确定某个字符串是否存在于某个文件中,然后将文件名输出到“noString.txt”的“noString.txt ”。我正在使用ack -i 'mystring' 'searchDir'来查找我要找的内容。cron job-ack命令没有找到

奇怪的是,当我手动调用脚本通过终端它完美,而是当的cron调用脚本我得到以下错误消息输出:

~/sourceDir/script.sh: line 30: ack: command not found

为什么它会在手动调用时工作,但在被cron调用时无法找到ack命令?


编辑:添加相关的代码和cron文件

山脚本 - 确定是否有任何文件要处理。

if [[ $(ls -A ${PWD}/*.zip) ]]; then 
     while [ $different -eq 1 ]; do 
      du -h 1> $compare1 
      ls -laR >> $compare1 
      sleep 25s 
      du -h 1> $compare2 
      ls -laR >> $compare2 

      if cmp $compare1 $compare2 ; then 
       mkdir -p $LOGAREA 
       mkdir -p $workarea/zip/unzip 
       touch $LOG 
       touch $ERRORLOG 
       sleep 2s 
       source ~/Desktop/Scripts/readfolderfiles.sh $drop 
       mv *epub $workarea 
       rm $compare1 
       rm $compare2 
       bash ~/Desktop/Scripts/Page_Label/script/searchString.sh 
       different=0 
      else 
       echo 
      fi 
     done 1> $LOG 2> $ERRORLOG 
    else 
    rm ~/Desktop/page_labels.running 
    rm $drop/page_labels.running 
    fi 

识别和报告脚本 - 生成在顶部

for files in *.zip; do 
    #move and unzip the files 
    mv $workarea/$files $workarea/zip/unzip/${files%.epub}.zip 
    sleep 2s 
    unzip zip/unzip/*.zip -d zip/unzip/${files%.epub} 
    mv zip/unzip/*.zip zip 
    sleep 2s 
    cd $workarea/zip/unzip 
    for dir in *; do 
     # Search the files for the searchString 
     if ack --ignore-case 'searchString' $dir; then 
      echo $dir >> $drop/Has_searchString.txt 
      echo 
      rm -r $dir 
      sleep 5s 
     else 
      echo $dir >> $drop/No_searchString.txt 
      echo 
      rm -r $dir 
      sleep 5s 
     fi 
    done 
    cd $workarea 
done 

的Cron文档

#!/bin/bash 
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin 

#### Backup Files 
* * * * 1,2,3,4,5 bash ~/Desktop/Scripts/searchScript.sh &> /dev/null; 
+1

的cron的环境是非常有限的,的'路径ACK '可能不知道它。因此,您可以在脚本中添加完整路径('/ bin/ack -i'mystring''searchDir''或任何您从'ack'中获得的内容]。 – fedorqui 2014-10-27 13:53:01

+0

@fedorqui我试过了。没有骰子。仍然只在手动调用时才起作用 – 2014-10-27 14:56:32

+0

确定,然后将您的代码的相关部分与您的cronjob语法一起发布。 – fedorqui 2014-10-27 15:02:58

回答

2

您需要设置PATH环境变量在cron作业中提及的输出。 所以有关cron文件的顶部添加此:

#!/bin/bash 
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin 

注:还添加#/斌/ bash的,所以你不必增加外壳环境变量呢!

+0

是的,我的不好。谢谢:) – 2014-10-27 14:01:58

+0

我试着将其添加到我的cron设置,但没有骰子。 '#!/ bin/bash' PATH =/sbin:/ bin:/ usr/sbin:/ usr/bin:/ usr/local/bin '* * * * * bash〜/ script&>/dev/null;' – 2014-10-27 14:52:17

3

这是因为搜索路径没有定义。

使用脚本中的任一完整路径或者定义路径

选项1:

/path/to/ack -i 'mystring' 'searchdir' 

选项2:

PATH=/path/to/ackdir:$PATH 
export PATH 

ack -i 'mystring' 'searchdir' 
+0

我试着在''/ usr/local/bin/ack'中加入完整的路径来确认,但它仍然无法工作。我也尝试添加选项2到我的cron文件中,但没有运气。 – 2014-10-27 14:43:59

+0

看你在你的问题提供的脚本和cronjob。请确保你避免使用home快捷方式〜/这是因为你可以在你的用户home文件夹中写入script/home/user,但是cronjobs在root用户下运行,所以在这种情况下〜/的含义是不同的。除非你在同一个用户下使用cronjob。 – 2014-10-28 08:37:46

+0

我没有删除'〜'快捷方式,并将其替换为昨天的硬路径。没有改变结果。 – 2014-10-28 14:33:37