このスレッドは未解決です(解決したらこちらで解決済にしてください)
<<戻る

タイムアウト処理がうまくいかない このメッセージに返信する
日時: 2010/09/03 11:35
名前: ケルベロス
URL:
bashでタイムアウト処理を作成しているのですが、
うまくいきません。
アドバイスお願いします。
よろしくお願いします。

1.時間以内に何も入力されていなければ、タイムアウトし、管理者へメール送信する
2.入力した値が、正常値であれば、処理を実行する
3.入力値に誤った値を入力されれば、処理をループする。(入力を促すところまで戻る)


printf "ANSWER: ";
read -t 5 REG
#タイムアウト処理
if [ "${REG}" != "" ]; then
echo -e ""
echo -e "${MSG037}"
echo -e "${MSG038}"
#管理者宛へメール送信
echo -e "${SSH_CONNECTION} \n timeout" | mail -s "time out" root
exit 1
elif [ "${REG}" = "1" ]; then
echo -e "test1"
exit 1
elif [ "${REG}" = "2" ]; then
echo -e "test2"
exit 1
fi
記事編集 編集
Re: タイムアウト処理がうまくいかない このメッセージに返信する
日時: 2010/09/03 11:46
名前: Yaxa
URL: http://yaxa.jp
>bashでタイムアウト処理を作成しているのですが、
>うまくいきません。
>アドバイスお願いします。
>よろしくお願いします。
>
>1.時間以内に何も入力されていなければ、タイムアウトし、管理者へメール送信する
>2.入力した値が、正常値であれば、処理を実行する
>3.入力値に誤った値を入力されれば、処理をループする。(入力を促すところまで戻る)
>
>
>printf "ANSWER: ";
>read -t 5 REG
>#タイムアウト処理
>if [ "${REG}" != "" ]; then
> echo -e ""
> echo -e "${MSG037}"
> echo -e "${MSG038}"
> #管理者宛へメール送信
> echo -e "${SSH_CONNECTION} \n timeout" | mail -s "time out" root
> exit 1
> elif [ "${REG}" = "1" ]; then
> echo -e "test1"
> exit 1
> elif [ "${REG}" = "2" ]; then
> echo -e "test2"
> exit 1
>fi
>

Googleで検索すれば見つかります。。
「bash タイムアウト処理」で検索。約 198,000 件ヒット


作成に関する代表的な参考サイト
http://tiki.is.os-omicron.org/tiki.cgi?c=v&p=bash
記事編集 編集
Re: タイムアウト処理がうまくいかない このメッセージに返信する
日時: 2010/09/03 11:47
名前: Yaxa
URL: http://yaxa.jp
参考にして下さい。私の基準

timeout=5

touch run.lock;
($*; rm run.lock) &

cnt=0
while true
do
if [ ! -f run.lock ]; then
break;
fi
if [ $cnt -ge $timeout ]; then
break;
fi
echo "sleep [$cnt]"
sleep 1;
cnt=`expr $cnt + 1`
done

if [ -f run.lock ]; then
pkill -TERM $1
fi
記事編集 編集
Re: タイムアウト処理がうまくいかない このメッセージに返信する
日時: 2010/09/03 14:02
名前: ケルベロス
URL:
タイムアウトはされているようですが、
正常値を入力しても、タイムアウトとし、正常終了してしまいます。

何も入力しない(5秒) = タイムアウトし、正常終了
1を入力(0秒) = タイムアウトし、正常終了。test1の文字列が表示されない。


read -t ${TIMEOUT} REG
while :
do
if [ $cnt -ge ${TIMEOUT} ]; then
sleep 1;
cnt=`expr $cnt + 1`
case $REG in
"1" )
echo -e "test1"
break;;
"2" )
echo -e "test2"
break;;
"n" )
cancel
break;;
* )
echo -e "そのような番号はありません。"
break;;
esac
break;
exit 1
else
echo -e "\nタイムアウトしました。"
exit 1
fi
done
記事編集 編集
Re: タイムアウト処理がうまくいかない このメッセージに返信する
日時: 2010/09/03 18:54
名前: 新高校生
URL:
readコマンドの戻り値を$?で取り出し
0で無かったらタイムアウトしているので

while true; do
read -t 5 -p "ANSWER(1 or 2): " REG
if [ $? -ne 0 ]; then
echo -e "\nSorry, the time is out..."
exit 1
elif [ ${REG} == "1" ]; then
echo -e "1の処理"
exit 1
elif [ ${REG} == "2" ]; then
echo -e "2の処理"
exit 1
else
echo -e "Select again, please."
fi
done

みたいな感じでできそうです(適当に変更)
記事編集 編集
Re: タイムアウト処理がうまくいかない このメッセージに返信する
日時: 2010/09/05 15:00
名前: 新高校生
URL:
わかり難かったでしょうか?

>1.時間以内に何も入力されていなければ、タイムアウトし、管理者へメール送信する
>2.入力した値が、正常値であれば、処理を実行する
>3.入力値に誤った値を入力されれば、処理をループする。(入力を促すところまで戻る)
>
>
>printf "ANSWER: ";
>read -t 5 REG
>#タイムアウト処理
>if [ "${REG}" != "" ]; then
>echo -e ""
>echo -e "${MSG037}"
>echo -e "${MSG038}"
>#管理者宛へメール送信
>echo -e "${SSH_CONNECTION} \n timeout" | mail -s "time out" root
>exit 1
>elif [ "${REG}" = "1" ]; then
>echo -e "test1"
>exit 1
>elif [ "${REG}" = "2" ]; then
>echo -e "test2"
>exit 1
>fi

上記をふまえて書くと

while true; do
printf "ANSWER: ";
read -t 5 REG
#タイムアウト処理
if [ $? -ne 0 ]; then
echo -e ""
echo -e "${MSG037}"
echo -e "${MSG038}"
#管理者宛へメール送信
echo -e "${SSH_CONNECTION} \n timeout" | mail -s "time out" root
exit 1
elif [ "${REG}" = "1" ]; then
echo -e "test1"
exit 1
elif [ "${REG}" = "2" ]; then
echo -e "test2"
exit 1
fi
done

となります。
ループの中でsleepをかけ、カウンターでカウントしてタイムアウトをと
考えているようですが、readコマンドは(基本的に)一行分を読み込むまで
待っていますから、ループでぐるぐる回してタイムアウトを判断するする
ようなやり方は難しいでしょう。というか、逆に言うとそのために
readコマンドに -t オプションがついているので、-tオプションの
リターンコードで判断するのが手っ取り早いことになります。
記事編集 編集
Re: タイムアウト処理がうまくいかない このメッセージに返信する
日時: 2010/09/06 05:53
名前: ケルベロス
URL:
なるほど!

できました。
ありがとうございます。
記事編集 編集
件名※必須
名前※必須
URL
任意のパスワード (投稿後のコメント修正・削除時に使用)
画像認証※必須 投稿キー(画像で表示されている数字を入力)
コメント※必須

※質問を投稿後に自己解決された場合は、原因と行った対処を具体的に書き込み下さるよう、よろしくお願いします。

- WEB PATIO -