質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.49%

シェルスクリプトで、timeoutコマンド発動時でもコマンド実行結果を出力する方法を知りたい

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,472

score 41

前提・実現したいこと

timeoutコマンド発動時でも、コマンドの実行結果を出力する方法を知りたいです。
(今回行いたいのは、ftpコマンドです。)

●今回実行したいコマンド
timeout 10s ftp -v -n < test.bat > ftpResult.txt

該当のソースコード

#!/bin/bash -

# ファイルの説明
# test.bat ←FTPをバッチモードで行うためのファイル
# ftpResult.txt ←FTPコマンドの結果を書き込むファイル

# test.batファイルを作成する。FTP転送のためのコマンド文字列を入力する。
cat <<EOF > 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

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • umino

    2020/02/14 20:27

    yureighostさん
    質問ありがとうございます。
    リダイレクトされるタイミングは、コマンドが終了したタイミングでしょうか。それなら出力されませんね。FTP処理をバックグラウンドで実行する方法を検討し、waitで待つ方法を検討したいと思います。
    (しかし、この投稿をしたあと仕様変更の可能性を言い渡されまして、処理自体が不要になるかもしれません...)
    質問・またヒントをいただけたことに感謝します。

    キャンセル

  • otn

    2020/02/15 18:12

    > リダイレクトされるタイミングは、コマンドが終了したタイミングでしょうか。
    いいえ。コマンド実行開始時です。

    キャンセル

  • umino

    2020/02/19 09:24

    otnさん
    追ってのご回答ありがとうございます。
    コマンド実行開始時にリダイレクトされるんですね。それならば、いまのままのコマンドでも可能そうですね。みなさんから頂いた回答をよく読んでみます。
    お礼が遅くなりごめんなさい。

    キャンセル

回答 3

checkベストアンサー

+2

192.168.101.102でタイムアウトした場合でもログは出力されるのでは...と踏んでいます(NotConnected.などのログ)

FTPのconnectのタイムアウトがtimeoutコマンドで指定したタイムアウト時間より小さい場合は出力されます。

timeoutコマンドはタイムアウトすると指定して実行したプロセスを終了させます。
よってFTPコマンドは「NotConnected.などのログ」を出力出来ずに終了します

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/02/19 09:28

    Y.Hさん
    さっそくご回答いただいたのに、返信が遅れすみません。
    リダイレクトされるタイミングはコマンド実行時と同時ということで、ログがでていないな~と感じたのは、ただ何も出力すべきログがなかったから、ということでした。
    わたしの検証不足で、お騒がせしてしまいました。
    ご回答ありがとうございました。
    検証できる環境がなくなってしまいすぐに試せないのですが、準備でき次第トライしてみます。

    キャンセル

  • 2020/02/19 09:39

    これ↓と同じ状態です。

    timeout 5s bash -c 'sleep 10s; echo "connected"; sleep 5s; echo "hello!!"' > out.txt
    結果はout.txtは0byte。

    timeout 5s bash -c 'sleep 3s; echo "connected";sleep 5s; echo "hello!!"' > out.txt
    結果はout.txtはconnectedのみ出力。

    キャンセル

  • 2020/02/19 10:38

    Y.H.さん
    例の提示、ありがとうございます。

    $ timeout 5s bash -c 'sleep 10s; echo "connected"; sleep 5s; echo "hello!!"' > out.txt
    $ cat out.txt
    $
    ↑なにも出力していない。
    「[5秒でタイムアウト。10秒スリープしてから、echoで"connect"書き込みして、echoで"hello!!"書き込み] []カッコ内をout.txtにリダイレクト」していて、最初の10秒スリープのところで終わっているので出力がなかった。

    $ timeout 5s bash -c 'sleep 3s; echo "connected";sleep 5s; echo "hello!!"' > out.txt
    $ cat out.txt
    connected
    $
    「[5秒でタイムアウト。3秒スリープしてから、echoで"connect"書き込みして、5秒スリープしてから、echoで"hello!!"書き込み] []カッコ内をout.txtにリダイレクト」していて、connect書き込み後の2回目のスリープのタイミングでtimeoutが起きたので、テキストにはconnectの出力があった。

    たしかに、途中まで結果が出力されますね。
    いまの環境でも試せるコマンドでの例の提示、たいへん助かりました。
    実践したことでイメージできました。
    ありがとうございました。

    キャンセル

+1

ftpコマンドから何か出力された後に、timeoutコマンドがタイムアウトしてftpコマンドを終了させた場合、その出力されたものは、ちゃんと残ります。

出力先ファイルが空ということは、ftpコマンドが何か出力する前に、timeoutコマンドで終了させられたということです。何も複雑な話ではないです。

FTP接続に時間がかかるなどの理由

「など」のケースはわかりませんが、FTP接続に時間がかかる場合は、接続するか、FTPコマンドが接続タイムアウトするまでは何も出力されません。
手元で実行してみると、コネクトのエラーメッセージが出るまで1分くらいかかるので、その場合、
timeout 100 ftp ~~~
とかすれば、コネクトのエラーメッセージが出ると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/02/19 09:41

    otnさん
    せっかくご回答いただいたのに、返信が遅れすみません。
    わたしが「timeoutコマンドが発行されたから、ftpログになにも出力されなかった」と思っていたのは誤りなのですね。てっきり、timeoutコマンドが発行された時点で、ftpはなかったことになるのかと思っていました。ログになにも出力されていなかったのは、ftpコマンドで出力すべきログがなかっただけのお話でしたか。
    ftpコマンドのログ出力タイミングを勘違いしていたことも、原因のひとつでした。
    誤りを正して頂いて、ありがとうございました。

    キャンセル

-1

パイプ(|)でつないだteeコマンドを試してみてください。 timeoutコマンドでftpコマンドの実行プロセスは終了されますが、その前までにteeコマンドへ流された標準出力はteeコマンドに渡され、ftpResult.txtに保存されます。

以下、コマンド入力例です。※確認したところftpコマンド実行時の一部のエラーは標準エラー出力に出力されているようなので、2>&1で合流させます。

$ timeout 10s ftp -v -n < test.bat 2>&1 | tee ftpResult.txt


いくらかでもご要望の結果に近づくかもしれません。
※仕様変更の可能性があるとのことで、無用な情報となるかもしれませんが、個人的に興味があったので回答してみました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/02/17 20:07

    低評価自体は構わないのですが、理由を知りたかったですね。確認した上で投稿したのですが。

    キャンセル

  • 2020/02/19 09:36

    dodox86さん
    せっかくすぐにご回答いただいたのに、返信が遅れすみません。
    teeコマンドをパイプで実行する案、普段使っているのでなんとなく安心感があり、イメージもできました。
    ftp実行中にtimeoutコマンドが発動した場合、ftpコマンド実行中にteeに流したログは出力されるのですね。
    職場でftp検証できる環境がなくなってしまい、いますぐには試せないのですが、準備でき次第トライしてみます。
    わざわざ確認した上で投稿くださって、ありがとうございます。
    丁寧なご回答に感謝します。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • Linuxに関する質問
  • シェルスクリプトで、timeoutコマンド発動時でもコマンド実行結果を出力する方法を知りたい