У меня есть простой сценарий оболочки, который запускает несколько команд 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