2016-05-21 4 views
1

私はbashスクリプトでバックグラウンドでコマンドを起動します。私はvarのstderrを回復する必要があり、どのようにわからない。助けて! :DBash。バックグラウンドコマンドのstderrを回復する

#!/bin/bash 
existingdestiny="8.8.8.8" #this is google dns for the example 
ping -c 1 $existingdestiny -W 1 > /dev/null 2>&1 
exitvar=$? 
echo "exitvar: $exitvar" 

nonexistingdestiny="172.16.0.234" #this is a non accesible ip example 
ping -c 1 $nonexistingdestiny -W 1 > /dev/null 2>&1 
exitvar=$? 
echo "exitvar: $exitvar" 

これは動作しますが、0と1を返します。これは正解です。バックグラウンドでコマンドを入力すると、私はstdoutを取ることができません。見てみましょう:

#!/bin/bash 
existingdestiny="8.8.8.8" #this is google dns for the example 
ping -c 1 $existingdestiny -W 1 > /dev/null 2>&1 & 
exitvar=$? 
echo "exitvar: $exitvar" 

nonexistingdestiny="172.16.0.234" #this is a non accesible ip example 
ping -c 1 $nonexistingdestiny -W 1 > /dev/null 2>&1 & 
exitvar=$? 
echo "exitvar: $exitvar" 

0と0が正しくありません。どうすれば正しい回答を得ることができますか?

答えて

1

終了コードと標準エラー出力(別名「stderr」)は、2つの異なるものです。標準エラー出力は、任意のプログラムが必要なものを書くことができる出力ストリームです。終了コード(終了ステータスとも呼ばれます)は、プロセスによって返された整数です。

質問のスニペットから、終了コードを取得すると仮定します。

特別なシェル記号$?実際に最後に開始されたコマンドの終了コードを返します。しかし、これはバックグラウンドで開始されたコマンドでは&で動作しません。これは、コマンドがバックグラウンドで開始されているため、まだ完了していないためです。そしてそれが終わったとしても、シェルは知らなかったでしょう。

バックグラウンドで開始されたコマンドの終了コードを&で取得するには、waitコマンドを使用する必要があります。 waitコマンドの終了コードは、待っていたコマンドの終了コードとまったく同じです。 waitコマンドはバックグラウンドプロセスが終了するのを待ちます。バックグラウンド・プロセスがすでに終了している場合、waitコマンドは瞬時に戻ります。

waitコマンドを使用するには、バックグラウンドプロセスのプロセスIDを知る必要があります。バックグラウンドで開始されたコマンドのプロセスIDは、$!特別なシンボル。これだけバックグラウンドでのpingを開始し、それだけでハングするのを待っている、

COMMAND & 
pid="$!" 
# Optional: Do something else while ping runs 
wait "$pid" 
exitcode="$?" 
echo "exitcode=$exitcode" 

注しかしpingコマンド自体が停止しないこと。したがって、次のコードは、あなたがやりたいだろう。

バックグラウンドでpingを実行しないことをお勧めします。 pingがハングしないように、すでにオプション-cと-Wを正しく使用しています。

+0

ああ、私は終了コードが必要でした。そして別の質問...どのようにバックグラウンドにコマンドを送信すると同時にstdoutを得ることができますか?私は 'iface = $(airmon-ng start wlan0 2>/dev/null | grep monitor)'というコマンドをバックグラウンドに送ることができますが、どこに置いてもgrep stopとiface varは空の。何か案が? – OscarAkaElvis

1

バックグラウンドプロセスのPIDを記録し、戻り状況を収集するにはwaitを呼び出す必要があります。

ping -c 1 $nonexistingdestiny -W 1 > /dev/null 2>&1 & 
ping_pid=$! 
wait $ping_pid 
exitvar=$? 
echo "exitvar: $exitvar" 

(私はあなたが戻りステータスではなく、ファイルディスクリプタ2であるstderrをしたいと思います)。

関連する問題