質問: ### 前提・実現したいこと timeoutコマンド発動時でも、コマンドの実行結果を出力する方法を知りたいです。 (今回行いたいのは、ftpコマンドです。) ●今回実行したいコマンド timeout 10s ftp -v -n < test.bat > ftpResult.txt ### 該当のソースコード ``` #!/bin/bash - # ファイルの説明 # test.bat ←FTPをバッチモードで行うためのファイル # ftpResult.txt ←FTPコマンドの結果を書き込むファイル # test.batファイルを作成する。FTP転送のためのコマンド文字列を入力する。 cat < test.bat open 192.168.101.102 username password123 lcd /home/localuser/ cd /home/remoteuser/ put hoge.file bye EOF # タイムアウト設定し、batファイルモードでFTP実行する。 # 結果はftpResult.txtへリダイレクトする ftp_cmd_exec=`timeout 10s ftp -v -n < test.bat > ftpResult.txt ``` ●↓timeoutコマンドが発動する前にFTPが正常終了した場合 ftpResult.txtには下記のようにftpコマンドの結果が現れます。 ``` $ cat ftpResult.txt Connected to 192.168.101.102 (192.168.101.102). 220 (vsFTPd 3.0.3) 331 Please specify the password. 230 Login successful. Local directory now /home/localuser/ 250 Directory successfully changed. local: hoge.file remote: hoge.file 227 Entering Passive Mode (192,168,101,102,214,124). 150 Ok to send data. 226 Transfer complete. 17 bytes sent in 4.2e-05 secs (404.76 Kbytes/sec) 221 Goodbye. ``` ●↓FTP接続に時間がかかるなどの理由でtimeoutコマンドが発動した場合 ftpResult.txtになにも出力されません。 ``` $ cat ftpResult.txt $ ``` timeoutが発動した場合でも、ftpResult.txtにはFTP実行結果を入力したいです。 FTPで問題が起きた際に、このftpResult.txtから解析する必要があるため、 なんとかして、timeoutコマンド発動時でも結果を出力したいです。 よい方法をご存知のかた、ご教示いただけませんでしょうか? どうぞよろしくおねがいします。 ### 補足情報(FW/ツールのバージョンなど) Linux CentOS bash
回答: `ftp`コマンドから何か出力された後に、`timeout`コマンドがタイムアウトして`ftp`コマンドを終了させた場合、その出力されたものは、ちゃんと残ります。 出力先ファイルが空ということは、`ftp`コマンドが何か出力する前に、`timeout`コマンドで終了させられたということです。何も複雑な話ではないです。 > > FTP接続に時間がかかるなどの理由 > > > 「など」のケースはわかりませんが、FTP接続に時間がかかる場合は、接続するか、FTPコマンドが接続タイムアウトするまでは何も出力されません。 手元で実行してみると、コネクトのエラーメッセージが出るまで1分くらいかかるので、その場合、 `timeout 100 ftp ~~~` とかすれば、コネクトのエラーメッセージが出ると思います。