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 をファイルにリダイレクトすると>
、2 つのステートメントからの出力のみが表示されますecho
。 コマンドからログを取得するにはどうすればよいでしょうかsftp
。
編集:
以下のフォームも試しましたが、機能しませんでした。
sftp -b バッチファイル.txt[メールアドレス]( cron からリダイレクト )
sftp -b バッチファイル.txt[メールアドレス]>> some_file.log ( cron からのリダイレクト + この行からのリダイレクト )
この問題は、マニュアル ページに記載されているように、対話的に実行されるはずの sftp の性質に関連していると思います。しかし、解決策が見つかりません。
私の配布: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
最後に に注意してください。これは、「ファイル記述子 2stderr
をファイル記述子 1 にリダイレクトする」という意味です。すでにファイルにstdout
リダイレクトしているため、もそこにリダイレクトされます。stdout
stderr