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

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

新規登録して質問してみよう
ただいま回答率
85.49%
シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

Q&A

解決済

3回答

6296閲覧

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

umino

総合スコア54

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

コマンド

コマンドとは特定のタスクを行う為に、コンピュータープログラムへ提示する指示文です。多くの場合、コマンドはShellやcmdようなコマンドラインインターフェイスに対する指示文を指します。

シェル

シェル(shell)はUnix や Linux 系のOSで使用されるコマンドインタプリタを指します。

0グッド

0クリップ

投稿2020/02/14 02:50

編集2020/02/14 03:05

前提・実現したいこと

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

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

該当のソースコード

sh

1#!/bin/bash - 2 3# ファイルの説明 4# test.bat ←FTPをバッチモードで行うためのファイル 5# ftpResult.txt ←FTPコマンドの結果を書き込むファイル 6 7# test.batファイルを作成する。FTP転送のためのコマンド文字列を入力する。 8cat <<EOF > test.bat 9open 192.168.101.102 10username 11password123 12lcd /home/localuser/ 13cd /home/remoteuser/ 14put hoge.file 15bye 16EOF 17 18# タイムアウト設定し、batファイルモードでFTP実行する。 19# 結果はftpResult.txtへリダイレクトする 20ftp_cmd_exec=`timeout 10s ftp -v -n < test.bat > ftpResult.txt

●↓timeoutコマンドが発動する前にFTPが正常終了した場合
ftpResult.txtには下記のようにftpコマンドの結果が現れます。

console

1$ cat ftpResult.txt 2Connected to 192.168.101.102 (192.168.101.102). 3220 (vsFTPd 3.0.3) 4331 Please specify the password. 5230 Login successful. 6Local directory now /home/localuser/ 7250 Directory successfully changed. 8local: hoge.file remote: hoge.file 9227 Entering Passive Mode (192,168,101,102,214,124). 10150 Ok to send data. 11226 Transfer complete. 1217 bytes sent in 4.2e-05 secs (404.76 Kbytes/sec) 13221 Goodbye.

●↓FTP接続に時間がかかるなどの理由でtimeoutコマンドが発動した場合
ftpResult.txtになにも出力されません。

console

1$ cat ftpResult.txt 2$

timeoutが発動した場合でも、ftpResult.txtにはFTP実行結果を入力したいです。
FTPで問題が起きた際に、このftpResult.txtから解析する必要があるため、
なんとかして、timeoutコマンド発動時でも結果を出力したいです。

よい方法をご存知のかた、ご教示いただけませんでしょうか?
どうぞよろしくおねがいします。

補足情報(FW/ツールのバージョンなど)

Linux
CentOS
bash

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Y.H.

2020/02/14 04:41 編集

単純にopen 192.168.101.102でタイムアウトしていて 出力が何もない状態でタイムアウトしているのでは? hoge.fileのサイズが大きくて時間がかかっている場合は、 途中まで出力されませんか?
yureighost

2020/02/14 05:10

timeout時間でシェルでは処理を打ち切ってるわけですから、 結果が取得されるまでにそれ以上の時間がかかってるなら書き込めないのは当然かと。 FTP処理をバックグラウンドプロセスで動作させて、 FTPの結果が必要な処理のところでwaitで待つとかするのはどうでしょう。
umino

2020/02/14 11:24

Y.Hさん 質問ありがとうございます。 現時点でシェルスクリプトで実行した転送処理がうまくいかず、試せないのですが、単純にopen 192.168.101.102でタイムアウトした場合でもログは出力されるのでは...と踏んでいます(NotConnected.などのログ) まず、正常処理をシェルスクリプトで実行できるようにしないとだめですね。 質問いただいたことに感謝します。
umino

2020/02/14 11:27

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

2020/02/15 09:12

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

2020/02/19 00:24

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

回答3

0

ベストアンサー

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

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

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

投稿2020/02/14 18:39

Y.H.

総合スコア7914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

umino

2020/02/19 00:28

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

2020/02/19 00: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のみ出力。
umino

2020/02/19 01: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の出力があった。 たしかに、途中まで結果が出力されますね。 いまの環境でも試せるコマンドでの例の提示、たいへん助かりました。 実践したことでイメージできました。 ありがとうございました。
guest

0

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

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

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

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

投稿2020/02/15 09:31

otn

総合スコア84472

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

umino

2020/02/19 00:41

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

0

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

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

sh

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

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

投稿2020/02/15 07:22

dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2020/02/17 11:07

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

2020/02/19 00:36

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問