Por que o sftp oculta o log do stdout?

Por que o sftp oculta o log do stdout?

Eu tenho um script a.sh, que possui um sftpcomando:

echo "Starting to sftp..."
sftp [email protected] << END_SCRIPT
ls
mput *.csv.gz
bye

END_SCRIPT
echo "Sftp successfully."

Se eu executá-lo interativamente, a saída do log sftpserá mostrada. Porém, se eu configurá-lo em um crontab e redirecionar o stdout para um arquivo usando >, haverá apenas a saída das duas echoinstruções. Como posso obter o log do sftpcomando?

EDITAR:

Tentei os seguintes formulários e também não funcionou.

sftp -b arquivo_batch.txt[e-mail protegido](redirecionar do cron)

sftp -b arquivo_batch.txt[e-mail protegido]>> some_file.log (redirecionamento do cron + redirecionamento desta linha)

Acho que o problema deve estar relacionado à natureza do sftp, que deve ser executado interativamente, conforme indicado na página de manual. Mas não consigo encontrar a solução.

Minha distribuição:Red Hat Enterprise Linux AS release 3 (Taroon Update 2)

a entrada do crontab:

52 14 * * * sh /home/xxx/testing/xxx.sh > /home/xxx/testing/xxx_`date +\%Y\%m\%d`.log

E o log é criado com um horário correspondente à entrada do crontab.

versão SSH:

OpenSSH_3.6.1p2, SSH protocols 1.5/2.0, OpenSSL 0x0090701f

EDITAR:

Descobri que se eu redirecionar a saída do sftp no arquivo de script para um arquivo de texto, a mensagem do sftp será registrada. Então removo o arquivo de log e agendo-o com o cron. Após a execução do cron, o arquivo de log é gerado, mas não há mensagem do sftp. Em vez disso, ele contém apenas o log de outra instrução dentro do arquivo de script.

Se eu redirecionar a saída do sftp no arquivo de script e executá-lo interativamente, o log ficará perfeitamente correto. No entanto, se eu agendei com cron (sem redirecionamento na entrada do crontab, simplesmente agende), o log do sftp também desapareceu.

Responder1

Pelo que parece, o redirecionamento de saídaéocorrendo, mas você provavelmente deseja incluir stderrtambém. Tente isso no seu crontab:

52 14 * * * sh /home/xxx/testing/xxx.sh > /home/xxx/testing/xxx_`date +\%Y\%m\%d`.log 2>&1

Observe o 2>&1no final. Significa: "redirecionar o descritor de arquivo 2, stderr, para qualquer descritor de arquivo 1, stdout, seja." Como você já foi redirecionado stdoutpara o arquivo, stderrele também irá parar lá.

informação relacionada