2011-07-06 8 views
6

ソケット(以下のサンプルコード)を指すファイルディスクリプタがあります。ソケットがbashで閉じられているかどうかを確認しますか?

exec 3<>/dev/tcp/localhost/9999 
echo -e "Some Command\n" >&3 

時々、そのソケットが閉じて、再度開く必要があります(サーバーの再起動)。

ソケット(この場合はfd#3)が書き込み可能かどうかをテストするにはどうすればよいですか?

エコーは、ソケットが既に閉じられているかどうかにかかわらず、常に成功します。

+0

_it writable_ **か** _itがクローズされているかどうかを知りたいですか?最初のものは許可の質問、後者のものは状態の質問です。これらはわずかに関連しています(有効なファイルモードは、開かれているフラグによって影響を受けることがあります)。 – sehe

+0

@sehe許可の質問ではありません。彼はソケットについて話している。ソケットに関連する書き込み許可はありません。ソケットを開くことができれば、それを読んで書き込むことができます。 – EJP

+0

最も具体的には閉じている場合。私はそれが書き込み可能であることを知っている、私は通常の条件でソケットを開くことができますが、私は接続を(ネットワークの問題、サーバーがスクリプトが実行されているなどシャットダウン)を緩めるとき、私は先に進む前に再オープンする必要があります。 –

答えて

4

解決策は、サーバーからのフィードバックです。

サーバーに要求を送信するときには、応答する必要があります。

exec 3<>/dev/tcp/localhost/9999 
echo -e "Some Command\n" >&3 
sleep 5 # example max time given to server to respond 
cat <&3 #receive an answer 
check is correct, restart server otherwise 

EDIT: 決定するためのnetcatを使用すると、ポートがあなただけの状態フィールドをしたいポート/アドレスに対してnetstatコマンド、grepを使用して、cutでき

netcat -w 3 -z www.google.com 80 
if[ $? -eq 0 ] 
then 
    echo port open 
else 
    echo port closed 
fi 
+0

残念なことに、それはフィードバックのない一方向のフィードです。 –

+0

この場合、おそらくnetcatを使用してポートを開いているかどうかを判断しますか? – bbaja42

+0

「telnet」をリストに追加することもできます。私は実際にtelnetを使うことは許しませんが、/ devを持たず、netcatを持っていなかった古いシステムでそれを使うことを覚えています。 –

0

開かれています。接続が失われた後、特にデータを送信していない場合は、しばらくの間ソケットが「ESTABLISHED」と表示されることに注意してください。私はファイルディスクリプタ がまだ有効であるかどうかをテストするために余分なデータを書き込むことを示唆しているではないんだけど、あなたは、単にどんなデータ を書いてみることを示唆しています

注:

0

FDへの書き込みを試してみてくださいあなたはそれが働いていることを確認し、次にチェックします。書き込みに失敗した場合は、 ソケットを再度開いて、再度書き込みます。私は(簡潔なpsudoコードで)私自身の最終的な解決策を追加します

1

{ while true; 
    read file; 
    write to STDOUT } | 
{ while true; 
    netcat command; 
    write STDIN to buffer when/if netcat exits; 
    loop to restart netcat & first process buffered data if exists; } 

これは(に送信データの出力(ファイルの読み込み)とデータの処理を分離ソケットがない場合はファイルへのバッファリング)。ネットワークの問題が発生したときにパイプを使用して一時バッファを提供します。

第2のコードブロックのSTDINは、第1のコードブロックからの出力をバッファリングする。 netcatがstdinでデータを処理できない場合は、バッファファイルに書き出し、netcatを再起動しようとします。この方法では、ソケットが開いているかどうか(まだトリッキーなもの)と実際の書き込み(それが開いていることを確認した後でも失敗する可能性があります)との間に時間がありません。

3

opがこれを投稿して以来、これが表示されない可能性がありますが、他の人に役立つ可能性があります。

とにかく私はこの問題を探していましたが、次のことが分かりました。

プロセスのオープンfd(ファイル記述子)は、/ proc/fdの下にリストされています。

exec 3<>/dev/tcp/localhost/9999 

#check if still connected 
if [ $(ls /proc/$$/fd | grep -w "3") == 3 ]; then 
    #send data 
    echo -e "Some Command\n" >&3 
else 
    #perform reconnect 
    exec 3<>/dev/tcp/localhost/9999 
fi 

これはテストされていませんが、大部分はokです。いくつかの改善点もあります。また、あなたの小切手とfdへの書類との間にfdがなくなる窓があります。しかし、それはこれまでのすべての解決策に向いています。

関連する問題