• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:無限ループについて(while true~))

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

このQ&Aのポイント
  • サーバーとデータベースの接続確認を定期的に行っていますが、入力コマンドが無限ループに入ってしまい抜け出せません。
  • 接続確認のためにwhile文を使用し、30分ごとにプログラムを実行しているが、ループから抜け出せず問題が発生している。
  • 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