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