Скрипт Bash возвращает другое значение при запуске из задания cron, чем из командной строки - PullRequest
1 голос
/ 26 марта 2012

У меня есть скрипт bash, предназначенный для запуска из cron.Скрипт подсчитывает слова в документе и добавляет строку с текущим временем и количеством слов в файл CSV.В соответствующей части сценарий:

EPOCH=$(date +"%s")
WCC=$(wc -w ~/path/filename.txt | sed 's/\/Users\/username\/path\/filename.txt//' | sed 's/ //g')
echo $EPOCH,$WCCH4 >> ~/path/wordcount-data.csv

Этот сценарий запускается из cron со следующей записью:

0   *   *   *   *   sh /Users/username/path/wordcount.sh

Проблема заключается в том, что wc -w возвращает другое значение при запускеиз cron, чем при запуске из оболочки или при запуске из сценария оболочки, выполняемого в терминале.Другими словами, значение этого скрипта, выполняемого из cron, в настоящее время составляет 12438, но при запуске wc -w filename.txt в оболочке или при sh ./wordcount.sh оба возвращают значения 12445. Для того, чтобы это стоило, разница всегда равна 7, и количество слов в vim соответствуетотсчет слов начинается с cron.

Что объясняет различные значения и как это исправить?

Ответы [ 4 ]

2 голосов
/ 26 марта 2012

Попробуйте добавить

source ~/.bashrc

после Шебанга и еще одна важная вещь:

не вызывайте скрипт с sh, если это bash!

При sh bash находится в режиме POSIX. Я подозреваю, что это не предназначено здесь.

2 голосов
/ 26 марта 2012

Когда вы запускаете sh ./wordcount.sh, какой пользователь запускает скрипт?

Я подозреваю, что пользователь, который выполняет cron, не будет тем же самым, поэтому его домашний (~) каталог отличается.

Я бы изменил любую ссылку на ~ в вашем скрипте на абсолютные пути к каталогам.

1 голос
/ 26 марта 2012

Согласившись с beny23 здесь, самая распространенная ошибка в источниках скриптов cron из-за того, что cron не наследует ваш PATH.Вы должны установить cronpath внутри crontab или использовать абсолютные пути.

Второй источник ошибок может заключаться в том, что он запускается от другого пользователя.

Третий, который вы называете sh scriptname, а не scriptname напрямую, что означает, что шебанг игнорируется.Почему ты так делаешь?Разве скрипт не помечен как исполняемый?

0 голосов
/ 29 мая 2018

Я потерял много времени с этим, и он просто отсутствовал в начале файла сценария оболочки: #!/bin/bash

...