2014-10-27 12 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