Почему часть скрипта, выполняемого cron, не работает, если stderr не направлен в / dev / null? - PullRequest
0 голосов
/ 22 января 2012

Вот фрагмент из скрипта, который я обычно выполняю из cron:

if [ "$RESCAN_COMMAND" = "wipecache" ]; then
    log "Linking cover art."
    find $FLAC_DIR -name "*.jpg" | while read f; do c=`echo $f | sed -e 's/flac/mp3/g'`; ln -s "$f" "$c"; done
    log "Done linking cover art"
fi

Скрипт отлично работает при запуске из командной строки. Но когда запускается cron (как тот же пользователь), он терпит неудачу где-то в строке find. Сообщение «Готово» не регистрируется, и сценарий не продолжается после блока if.

Строка find создает ссылки из файлов, таких как flac/Artist/Album/cover.jpg до mp3/Artist/Album/cover.jpg. Есть несколько сотен файлов для ссылки. Команда генерирует большую часть выходных данных для stderr, потому что большинство, если не все ссылки уже существуют.

На догадку я попытался перенаправить stderr команды ln на /dev/null:

    find $FLAC_DIR -name "*.jpg" | while read f; do c=`echo $f | sed -e 's/flac/mp3/g'`; ln -s "$f" "$c" 2>/dev/null; done

С этим изменением скрипт успешно выполняется из cron (а также из командной строки).

Мне было бы интересно понять, почему.

Ответы [ 2 ]

3 голосов
/ 22 января 2012

Это может быть отчет об ошибке: https://bugs.launchpad.net/ubuntu/+source/cron/+bug/151231

1 голос
/ 23 января 2012

Это, вероятно, производит слишком много продукции. Это на самом деле не ошибка, но особенность, так как cron обычно отправляет электронные письма с выводом. MTA не любят текстовые сообщения с большим количеством строк, поэтому cron просто завершает работу. Возможно, тихий выход - это ошибка.

Вы также можете использовать ln -f для подавления ошибок ln только в случае уже существующих файлов.

...