Запустите команду как cron, но из командной строки - PullRequest
2 голосов
/ 08 июня 2010

У меня есть скрипт, который я пытаюсь запустить из cron.Когда я запускаю его из bash, он работает просто отлично.Однако, когда я позволяю cron сделать это, я получаю:

myscript.sh: строка 122: синтаксическая ошибка: неожиданный конец файла

То, что я хочу, этоспособ выполнить команду, как если бы это была работа cron, но сделайте это в моей оболочке.

В качестве примечания: кто-нибудь знает, что будет отличаться под cron?(в скрипте уже есть строка #!/bin/sh)


Чтобы ответить на свой вопрос: я добавил это в свой crontab:

*  *   * * *    bcs     for ((i=$(date +\%M); i==$(date +\%M) ;)) ; do find ~/.crontemp/ -name '*.run' -exec "{}" ";" ; sleep 1; done`

и создал этот скрипт:

#!/bin/sh
tmp=$(mktemp ~/.crontemp/cron.XXXXX)
mknod $tmp.pipe p
mv $tmp $tmp.pre
echo $* '>' $tmp.pipe '1>&2' >> $tmp.pre
echo rm $tmp.run >> $tmp.pre
chmod 700 $tmp.pre
mv $tmp.pre $tmp.run
cat $tmp.pipe
rm $tmp.pipe

При этом я могу выполнить произвольную команду с задержкой не более одной секунды.

(И да, я знаю, что с этим связаны всевозможные проблемы безопасности)

проблема была fi против if проблемы.Doh!

Ответы [ 3 ]

5 голосов
/ 08 июня 2010

Когда скрипт работает в интерактивном режиме и не работает в cron, это почти всегда проблема PATH.PATH по умолчанию в процессе работы cron намного короче, чем в интерактивном сеансе.Типичным результатом является ошибка «not found» для некоторой системной утилиты, которую вы пытаетесь запустить, и которая не указана в переменной PATH в cron.

Я думаю, что какая-то команда, которую вы пытаетесь запустить, не включенапуть, поэтому файл, который он должен был создать, пуст, и команда, которая пытается прочитать этот файл, выдает вам это сообщение об ошибке.

2 голосов
/ 08 июня 2010

У вас может быть "%" в вашем crontab. Вы должны экранировать его (с помощью "\"), иначе он будет заменен символом новой строки.

1 голос
/ 08 июня 2010

Это может быть несколько вещей - вывод будет перенаправлен в другое место; Переменные окружения почти наверняка будут другими и т. д. В предоставленной вами информации это может быть связано с различием между bash и / bin / sh (которые в некоторых системах, включая версии Linux для Debian / Ubuntu) разные, поддержка немного другого синтаксиса). Cron обычно запускает команду, которую вы ему даете, используя /bin/sh.

Попробуйте запустить:

/bin/sh -c '<command>'

, где <command> происходит от вашего crontab. (Конечно, если эта команда использует '' кавычки, вам необходимо изменить ее соответствующим образом ...)

...