Назад | Перейти на главную страницу

сценарий оболочки в crontab, не весь вывод записывается

У меня есть простой сценарий оболочки, который запускает несколько команд LFTP и обрабатывает файлы.
При запуске прямо из bash я получаю полный вывод этих команд LFTP на экран.

При запуске из crontab со следующим ...
*/5 * * * * /bin/bash /home/user/ftp-getter.sh >> /var/log/ftp-getter.log 2>&1
Я получаю вывод только тех строк, в которых я явно повторяю какой-то вывод, а вывод date команда. Текст, возвращаемый LFTP, не попадает в журнал.

Я пробовал переместить 2>&1 до >> и получить тот же результат.

При запуске этой команды crontab прямо из командной строки я получаю вывод LFTP как на экран, так и в файл журнала. Но не при работе в crontab.

Есть ли что-то особенное в выводе LFTP, которое могло бы вызвать это и которое могло бы применяться к другим командам при запуске из сценария оболочки в crontab?

Перенаправление из crontab должно работать, но вы можете попробовать другой подход - использовать exec внутри скрипта для перенаправления всего вывода. Используйте его так в начале скрипта:

exec 1>> /var/log/ftp-getter.log 2>&1

Теперь вам не нужно явно перенаправлять вывод отдельных команд в скрипте.

lftp могут использовать файловые дескрипторы, отличные от STDOUT и STDERR. Проверьте, запустив команду в strace

strace lftp ...

и найдите строки, начинающиеся с "write":

write(3, ...

Число - это дескриптор, в который пишет программа. Перенаправьте и этот дескриптор.

... >> /var/log/ftp-getter.log 2>&1 3>&1

Распространенной причиной того, что что-то не работает в cron, но работает в сеансе оболочки, является различие в среде.

Сравните вывод env при запуске из cron по сравнению с оболочкой. Напомним, что оболочка, запускаемая из cron, не является интерактивной, что может привести к различиям в том, как сценарии инициализации подготавливают среду.

Меня устраивает

*/5 * * * * screen -dmS ftp-getter /bin/bash /home/user/ftp-getter.sh >> /var/log/ftp-getter.log 2>&1