【发布时间】:2014-10-27 13:49:55
【问题描述】:
我编写了一个 bash 脚本,用于识别文件中是否存在某个字符串,然后将文件名输出到“noString.txt”的“hasString.txt”。我正在使用ack -i 'mystring' 'searchDir' 来查找我要查找的内容。
奇怪的是,当我通过终端手动调用脚本时,它运行良好,但是当 cron 调用脚本时,我得到以下错误消息输出:
~/sourceDir/script.sh: line 30: ack: command not found.
为什么手动调用会起作用,但是cron调用却找不到ack命令?
编辑:添加相关代码和cron文件
Lookout 脚本 - 确定是否有要处理的文件。
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;
【问题讨论】:
-
cron的环境非常有限,
ack的路径可能是未知的。因此,您可以在脚本中添加完整路径(/bin/ack -i 'mystring' 'searchDir'或您从which ack获得的任何内容)。 -
@fedorqui 我试过了。没有骰子。仍然只在手动调用时有效
-
好的,然后将代码的相关部分与您的 cronjob 语法一起发布。
-
问题(或至少其中一个问题)是您使用
~来处理主目录。 Crontab 不知道,所以需要使用完整路径。 -
mv $workarea/$files行可能没有任何用处;mv需要两个参数,而您似乎只给它一个。您应该运行脚本并将输出转到日志文件而不是/dev/null;这将使您更容易看到发生了什么问题。您还应该修改脚本以打印其环境(临时),以便您可以看到PATH的实际值是cron运行脚本时的值。您在这些脚本中使用的任何其他程序是否也在/usr/local/bin中?您的主脚本写入$ERRORLOG。那里有什么有用的信息吗?