残念ながら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
