У меня есть сценарий bash, который я написал, чтобы определить, существует ли определенная строка в файле или нет, а затем вывести имя файла в «hasString.txt» из «noString.txt». Я использую ack -i 'mystring' 'searchDir'
, чтобы найти то, что ищу.
Странно то, что когда я вручную вызываю скрипт через терминал, он работает отлично, но когда cron вызывает скрипт, я получаю следующее сообщение об ошибке:
~/sourceDir/script.sh: line 30: ack: command not found
.
Почему он работает при вызове вручную, но не может найти команду ack при вызове cron?
редактировать: добавление соответствующего кода и файла 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
Крон документ
#!/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;
ack
может быть ему неизвестен. Таким образом, вы можете добавить полный путь в свой скрипт (/bin/ack -i 'mystring' 'searchDir'
или что-то еще, что вы получите отwhich ack
). - person fedorqui 'SO stop harming'   schedule 27.10.2014~
для работы с домашним каталогом. Crontab этого не знает, поэтому вместо этого вам нужно использовать полный путь. - person fedorqui 'SO stop harming'   schedule 27.10.2014ack
?which ack
может вам сказать. Если он показывает каталог, который находится в PATH, который вы установили в файлеcrontab
, это озадачивает — на это будет причина, но мы еще не нашли ее. Если он показывает каталог, которого нет в указанном вами ПУТИ, есть ответ. Вы повторно отправилиcrontab
после внесения изменений в файл? - person Jonathan Leffler   schedule 28.10.2014/usr/local/bin/ack
. Единственное, что изменилось в моем cron на данный момент, это то, что я заменил жесткий путь вместо ярлыка~
. - person I Dabble   schedule 28.10.2014mv $workarea/$files
, вероятно, не делает ничего полезного;mv
требует два аргумента, а вы, кажется, даете только один. Вы должны запустить свой сценарий так, чтобы выходные данные попадали в файл журнала, а не в/dev/null
; это позволит вам легче увидеть, что происходит не так. Вы также должны изменить сценарий, чтобы он распечатывал его среду (временно), чтобы вы могли видеть фактическое значениеPATH
, когда сценарий запускаетсяcron
. Являются ли какие-либо другие программы, которые вы используете в этих сценариях, также в/usr/local/bin
? Ваш основной скрипт пишет в$ERRORLOG
. Есть ли там полезная информация? - person Jonathan Leffler   schedule 28.10.2014mv "$workarea/$files" "something_else"
. Таким образом, вы предотвратите проблемы, если имена файлов содержат пробелы или другие сложные символы. - person fedorqui 'SO stop harming'   schedule 29.10.2014ack
, полагаю, мне следует спросить, могу ли я сделать то же самое сgrep
. Мне не удалось заставитьgrep
делать то же, что иack
, описанное выше, но, возможно, кто-то другой лучше меня разбирается вgrep
. - person I Dabble   schedule 29.10.2014