[linux]rshのタイムアウト

残念ながらRHEL(RedHat)のrshコマンドにはタイムアウトのオプションが実装されていない。
rsh実行中にOSPFなどの動的ルーティングで経路が変わったりネットワークの状態に変化があった場合、
rshコマンドのパケットが戻ってこれずに、いつまで経ってもrshコマンドが終了しないという困った状態になる。
rshコマンドのタイムアウトが実装されていない場合の回避方法。
スクリプト使います。
ポイントは

  • rshをバックグラウンド実行
  • bashの特殊変数SECONDSを使用して、スクリプト開始からの経過時間を取得し、それを利用する

です。

#!/bin/bash

# タイムアウト秒数指定
timeoutsec=120

rsh "リモートコマンド" &
# バックグラウンド実行(rsh)のpidを取得
bpid=$!

startsec=${SECONDS}

while [[ 1 == 1 ]]
do

    # rshコマンド終了チェック
    stdout=$( ps auwwwwx | egrep "^.+[[:space:]]${bpid}[[:space:]]")
    if [[ -z "${stdout}" ]];then
        # 終了している
    	break
    fi
    
    # 経過分数を取得
    nowsec=${SECONDS}
    
    # rsh開始からの経過分数取得
    (( divsec=${nowsec}-${startsec} ))
    if (( ${divsec} > ${timeoutsec} ));then
    	# タイムアウト
    	kill -9 ${bpid}
    fi
    
    sleep 10
done

 

わからなければ以下の本を参考にしてもいいかも(キーワード検索なので的外れの場合もあります)
わからなければ以下の本を参考にしてもいいかも(機械検索なので的外れの場合もあります)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です