無限ループについて(while true~)

このQ&Aのポイント
  • サーバーとデータベースの接続確認を定期的に行っていますが、入力コマンドが無限ループに入ってしまい抜け出せません。
  • 接続確認のためにwhile文を使用し、30分ごとにプログラムを実行しているが、ループから抜け出せず問題が発生している。
  • Linuxで管理しているサーバーとデータベースの接続確認に用いるコマンドが無限ループしてしまい、どのように抜け出せば良いかわかりません。
回答を見る
  • ベストアンサー

無限ループについて(while true~)

たびたびお世話になります。 管理しているサーバーとデータベースの接続確認を、30分に一度行っているのですが、この際に入力していたコマンドが無限ループから抜け出すことができなくなってしまいました。 入力していたコマンドは、while true; do ./aaa.sh ; sleep 1800; doneです。 30分に一度、aaa.shを起動させて接続を確認する、というつもりで入力していたものなのですが…。 無限ループに気付き、プロセスをrootからkill(-kill) しても復活(?)してしまうようです。 このままでは問題があるため、なんとか無限ループを抜け出したいのですが、いい方法はありませんでしょうか? OSはLinuxです。 申し訳ありませんが、初心者中の初心者のため、必要な情報があまりわかりません。不足がありましたら、補足要求お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.3

> 親プロセスは調べたのですが(bashでした)、これをkillすることで、 > 他に影響のでる子プロセスがないのか心配です。 心配はごもっともです。 影響があるとすれば、このbashから起動されたプロセスが他にある場合ですが、 ps -ef|grep 1234|grep -v として、このbashだけが表示されるなら、PPIDにこのpidが含まれるプロセスはないということになるので、このbashを親プロセスとしているプロセスはないことになります。 それが確認できれば、killしても影響はないと思われます。 > ps -ef | grep bash > してみると、PIDもPPIDも違いますが、上記シェルを利用しているプロセスが幾つかありました。 シェルから起動されたコマンドがバックグラウンドで実行されている場合、bashがプロセスとして走ってます。なのでpsでみるといくつもbashが走っているように見えますが、PIDもPPIDも違えば別ものなので、影響はありません。

BluegrayChocolat
質問者

お礼

何度もアドバイスありがとうございました。 お礼がおそくなり申し訳ありません。 ご教示いただいたとおり、親プロセスをkillしたところ、 無事プロセスを止めることができました。 1つだけ、プロセスの相互関係のわからないものがあるため、 放置することになりましたが…ともあれ、一安心です。 丁寧な手順をありがとうございました。

その他の回答 (2)

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.2

No.1です。補足拝見しました。 ちょっと確認していただきたいのですが、 ps auxでなくて、 ps -ef| grep sleep | grep -v grep としてみてください。 UID PID PPID … のようなフォーマットで、3番目の項目にsleepの親プロセスのPIDが表示されると思います。 その数値(仮に1234とすると)をさらに、 ps aux|grep 1234|grep -v grep として、何のプロセス(多分シェル)かを特定し、それをkillしてみてください。(-killでなく普通に)

BluegrayChocolat
質問者

お礼

再びありがとうございます。 killする前に確かめたいのですが…。 親プロセスは調べたのですが(bashでした)、これをkillすることで、 他に影響のでる子プロセスがないのか心配です。 ps -ef | grep bash してみると、PIDもPPIDも違いますが、上記シェルを利用しているプロセスが幾つかありました。 該当のシェルをkillすることで、他に影響がでることはあるのでしょうか?

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.1

> プロセスをrootからkill(-kill) しても復活(?)してしまうようです。 killしたのはどのプロセスでしょうか。 aaa.shですか?sleepですか? 元々の while true; do ./aaa.sh ; sleep 1800; done はどうやって起動したのでしょうか。コマンドラインから&つきで直接入力して、そのターミナルは閉じてしまったのでしょうか。 もしシェルスクリプトで起動しているのなら、そのシェルスクリプトのpidをpsで調べてkillすればいいと思うのですが。

BluegrayChocolat
質問者

お礼

アドバイスありがとうございます。 >killしたのはどのプロセスでしょうか。 sleepです。 ps auxで見ると、sleep 1800というプロセスがいくつかあり、 これが該当の無限ループと思われるため、killしてみたのですが、 消えませんでした。 >while true; do ./aaa.sh ; sleep 1800; doneはどうやって起動したのでしょうか。 コマンドラインからの入力です。 普段はそのターミナルを開けっ放しにすることで確認しているのですが、 現在はループ回避のため、手動でシェルだけを起動しています。

関連するQ&A

  • shの停止方法

    こんばんわ。 shの停止方法がわからなくて困っています。 sh(qqq.sh)の内容は ******************* while true ; do sh xxx.sh sleep 1 done ******************* と、xxx.shを1秒ごとに起動するようにしています。 ですので、killコマンドでは1秒ごとに起動しているために早すぎてプロセスを停止できませんでした。 shのコマンドは #sh qqq.sh & で常駐するようにしました。 すごくこまっているのでご教授お願いします。

  • 作成したbシェルを実行すると無限ループになってしまいます

    テストの為のデータをファイルに出力したいんですが無限ループになります。 #!/bin/sh i=1001 x=1 y=1 while [ $x -le 100 ]; do printf "$i,1019,001,3989,01" while [ $y -le 100 ]; do printf "01,00987,0,0,11,高橋," y='expr $y + 1' done i='expr $i + 1' x='expr $x + 1' y=1 done > test.csv カンマで区切った最初のデータを100個、 次のデータを100個ファイルに入れたいんですが、 実行すると無限ループになります。

  • UNIX: catコマンドで無限ループ???

    正確にはOS X 10.9.5のbashですが、UNIX一般の質問と思われるのでこのようなタイトルにしました。 catコマンドで、あるテキストファイルのあとに、同じテキストファイルをつくろうと思いましたが、無限ループになってしまい、巨大ファイルができてしまいます。 最初、このようにしてa.txtという1行のファイルを作りました。  [~]$ cat > a.txt  aaa それで、同じa.txtを  aaa  aaa という2行のファイルにしたいと思い、以下のようなコマンドを入力しました。 [~]$ cat a.txt >> a.txt 自分の目論見としては、a.txtの内容がa.txtに追加されるので、2行になるかと思いましたが、応答がなくなりました。 Ctrl+Cで停止し、a.txtの内容を見ると [~]$ cat a.txt aaa aaa aaa aaa aaa aaa ・・・・・・ と何千行も入っています。 ファイルのサイズはこれぐらいでした。 [~]$ ls -al a.txt -rw-r--r-- 1 TYWalker staff 16898724 9 22 12:57 a.txt これは、なぜこのような現象になるのでしょうか。 また、私が本来やろうとしたことを、簡単なコマンドで行うにはどうすればいいでしょうか。 よろしくお願いします。

  • do while

    do whileの文で do{… }while(c!=1 && c!=2 && c!=3); つまり1,2,3以外の数字を入力した場合はループするようにしました。…は無限ループしないようにしています。実際1,2,3以外の数字を入力しても無限ループしません。しかし、数字以外の文字を入れてしまうと、無限ループします。%dがいけないのでしょうか?初心者ですので分かりやすくよろしくお願いします。多分これだけじゃ情報不足だと思うので、足りない情報があれば言ってください。すぐに書き込みます。

  • 指定プログラムのプロセスを監視・killするには?

    CGIが不正終了(もしくは無限ループ)して、CPUに負担をかけ続けることで悩んでいます。 topコマンドで負担をかけているプロセスを発見してkillすることは可能ですが、これを自動で実行するようなことはできないでしょうか。 cronを使って1分間に1度チェックし、3分以上同じプロセスが動いている場合にkillしたり、もしくは不具合の起こる特定のプログラム(hoge.cgi等)を監視してkillするということができるようにしたいのです。 自分で考えたのは「top -n 1」で出力して、3分間同じプロセスがCPUに負担をかけ続けている場合にkillできるようにphpなどでプログラミングすることでしたが、もっと簡単にできるような方法がありますでしょうか。

  • シェルで親プロセス終了時に子プロセスも終了させるには?

    シェルスクリプトを作っています. 親プロセス(AAA.sh)から子プロセス(BBB.sh)を呼び出した状態で,AAA.shをkillすると,BBB.shのプロセスが終了しないまま,残ってしまうため, http://oshiete1.goo.ne.jp/qa1968135.html を参考にkill -- -$$で同じプロセスグループのものが終了するように作ったのですが,BBB.shが呼び出される前にAAA.shをkillすると,プログラムが暴走してしまいます. どうすれば暴走せずに,親子ともども終了させることができるでしょうか??? *** AAA.sh *** #!/bin/sh func exit_AAA(){ kill -- -$$ exit 1 } trap "exit_AAA" HUP INT QUIT TERM echo "call BBB??(y/n)" read num ./BBB.sh *** BBB.sh *** #!/bin/sh echo "exit BBB?(y/n)>" read num

  • 無限ループに陥ってしまいました。(Excel)

    シート上に文字列がランダムにばら撒かれています。 (ばら撒かれている範囲もケースバイケースを想定しています) 最終的に、文字列をA1から順番に並べたいと思いました。 手順としてA列の文字列が入力されているセル行を調べてその回数ループさせる。もし、セルの値が""ならばセルを削除し上に詰める。そのときA列の最終行数を-1する。最終行数までくるとその列は終わり。 次の列に移動し繰り返して完了。 と、もくろんだのですが、A列のみで無限ループに陥ってしまいました。どなたか?詳しい方いらっしゃいましたら教えてください。 Sub test() Set sh1 = Worksheets("sheet1") For j = 1 To 50 LastRow1 = sh1.Cells(65536, j).End(xlUp).Row For i = 1 To LastRow1 If sh1.Cells(i, j).Value = "" Then sh1.Cells(i, j).Delete (xlShiftUp) i = i - 1 LastRow1 = LastRow1 - 1 End If Next Next End Sub

  • Unixの親プロセスと子プロセスの関係について

    はじめまして。 親プロセスが終了するとそのプロセスから呼ばれた 子プロセスも停止するという認識は正しいでしょうか? というのも、あるシェルスクリプトを"kill -9"コマンドで強制終了させたのですが、そのシェルスクリプト内のコマンド(sleepコマンドです)は終了せずに残っていたので(psで確認しました)、??という感じでした。 さらにそのsleepコマンドの親プロセスが1(init?)になっていました。 色々とWEB上で調べてみたのですが、この動作について の記述を見つけることができませんでした。 どなたかご存知でしたら是非ご教授下さい。よろしくお願いします。

  • 死なない(不思議な?)プロセスの振舞いについて

    プロセスの振舞いでよく分からない点がありますので、 この点に詳しい方、ぜひご教授下さい。 実験として、次のような無限ループをもつシェルスクリプトを作りました。 #!/bin/sh while : do echo "hogehoge" > tmp echo "Please stop me!" sleep 1 done このfile名を loop.sh として、実行属性を付けてから $ ./loop.sh & とバックグラウンドで実行してみます。 すると、1秒毎に、tmpにhogehogeと書き込まれ 標準出力にPlease stop me!と標準出力に表示されますが、 ここで、 exitコマンドでterminalを急に閉じてみます。 こうした場合、どうやら、このプロセスは何処かで生き続けるようなのです。 というのも、新たにterminalを起動し、上で出来た tmp をrmで消そうとしても、 すぐ新たなtmpが作られるからです。 しかも、単にlogoutしただけではこのプロセスは死なないようです。 (再起動するとさすがに止まります。) そこで質問ですが、 1) 上のプロセスが生き続けていることを確認する方法はありますか? 2) この生き続けたプロセスを再起動せずに殺す方法はありますか? 3) このようにシェルスクリプト実行中に急にexitをされた場合でも、 スクリプトが正常終了するように予めスクリプトを組むことは出来ますか? 以上3点についてご教授いただけたら幸です。 よろしくお願いします。

  • レンタルサーバで、cgiが暴走した場合の対応

    自宅Windows環境で、perlで書いたcgiを動かしていました。 そのcgiをブラウザで表示した際に、プログラムのエラー(無限ループだと思うのですが) 応答が無くなってしまいブラウザを強制終了させ、cpu利用率100%の perl.exe(だったと思うのですが)のプロセスを終了しました。 レンタルサーバでcgiが暴走した場合の対処法を教えて下さい。 "ssh"でレンタルサーバに接続し、暴走したプロセスをtopコマンドで確認できるでしょうか? コマンド"ps"で確認し、暴走したプログラムをkillで終了させることは一般ユーザでは無理でしょうか? 私の知らないキーワードを教えて頂ければ最高です。 宜しくお願いします。