У меня есть скрипт a.sh
, в котором есть sftp
команда:
echo "Starting to sftp..."
sftp [email protected] << END_SCRIPT
ls
mput *.csv.gz
bye
END_SCRIPT
echo "Sftp successfully."
sftp
Если я запускаю его интерактивно, отображается вывод журнала из . Однако, если я устанавливаю его в crontab и перенаправляю stdout в файл с помощью >
, будет только вывод из двух echo
операторов. Как мне получить журнал из sftp
команды?
РЕДАКТИРОВАТЬ:
Я попробовал следующие формы, но они тоже не сработали.
sftp -b пакетный_файл.txt[email protected](перенаправление из cron)
sftp -b пакетный_файл.txt[email protected]>> some_file.log (перенаправление из cron + перенаправление из этой строки)
Я думаю, что проблема должна быть связана с природой sftp, который должен работать интерактивно, как указано в man-странице. Но я не могу найти решение.
Мой дистрибутив:Red Hat Enterprise Linux AS release 3 (Taroon Update 2)
запись в crontab:
52 14 * * * sh /home/xxx/testing/xxx.sh > /home/xxx/testing/xxx_`date +\%Y\%m\%d`.log
И журнал создается со временем, соответствующим записи в crontab.
ssh-версия:
OpenSSH_3.6.1p2, SSH protocols 1.5/2.0, OpenSSL 0x0090701f
РЕДАКТИРОВАТЬ:
Я обнаружил, что если я перенаправляю вывод sftp в файле скрипта в текстовый файл, сообщение от sftp регистрируется. Затем я удаляю файл журнала и планирую его с помощью cron. После выполнения cron файл журнала создается, но в нем нет сообщений от sftp. Вместо этого он содержит только журнал от другого оператора внутри файла скрипта.
Если я перенаправляю вывод sftp в файл скрипта и запускаю его интерактивно, журналы в порядке. Однако если я запланировал это с помощью cron (без перенаправления в записи crontab, просто запланировал), журналы из sftp тоже исчезают.
решение1
Судя по всему, перенаправление выводаявляетсяпроисходит, но вы, вероятно, хотите включить stderr
, также. Попробуйте это в вашем crontab:
52 14 * * * sh /home/xxx/testing/xxx.sh > /home/xxx/testing/xxx_`date +\%Y\%m\%d`.log 2>&1
Обратите внимание 2>&1
на в конце. Это означает: "перенаправить файловый дескриптор 2, stderr
, на тот файловый дескриптор 1, stdout
, который есть". Поскольку вы уже перенаправлены stdout
на файл, stderr
попадете туда же.