Eu tenho um script a.sh
, que possui um sftp
comando:
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 sftp
será 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 echo
instruções. Como posso obter o log do sftp
comando?
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 stderr
també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>&1
no final. Significa: "redirecionar o descritor de arquivo 2, stderr
, para qualquer descritor de arquivo 1, stdout
, seja." Como você já foi redirecionado stdout
para o arquivo, stderr
ele também irá parar lá.