Perlを起動させたプログラムが不慮の死をとげるなどして、
起動時に開かれた標準入出力が、動作中に閉じられた場合、ゾンビ防止用として処理を終了させる必要があります。
これはどうやって調べたら良いのでしょうか?
現在は事故が起きた場合、
while (<STDIN>){}
の処理が突然、停止せずに無限ループを開始し始めてるのだろうと思います。
いきなりCPUを大量に使い、メモリが一気に膨れ上がります。
(たまに気づいたらそうなってるので確かめるのは難しいです)。
ちなみにコマンドプロンプトから呼び出された場合は、プロンプトが死ぬ間際に確実に始末してくれてるようですが、
(100万回ループでコマンドプロンプトを起動し、即座にそれを殺すとPerlもそれに伴って全部死んだ)、
世の中には粗悪なプログラムもあるようで、この粗悪なプログラムが死んだとき、ちゃんとPerlを殺してくれないらしいっぽい時がたまにあります。
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
子プロセスが親プロセスの終了を検出するには、ppidが変化したのを見ればいいんじゃない?
$ cat foo.sh
#!/bin/bash
echo "parent : pid = $$"
(i=5; while [ $i -gt 0 ]; do echo $i; i=$(expr $i - 1); sleep 1; done) | perl -e 'while(<STDIN>){print "child : ppid = ", getppid(), " : ", $_}' &
sleep 1
echo 'parent : exit'
exit
$ sh foo.sh
parent : pid = 23173
child : ppid = 23173 : 5
parent : exit
child : ppid = 1 : 4
child : ppid = 1 : 3
child : ppid = 1 : 2
child : ppid = 1 : 1
No.1
- 回答日時:
クローズされた入力から読もうとするとEOFになり、クローズされた出力に書くと単に捨てられるだけだと思います。
無限ループになるとしたら、クローズされたわけではないのでは?標準入力は何に関連付いていたのでしょうか?ファイル?パイプ?
ちなみに、Unix/Linuxだと親プロセスが死んでも自動的には子プロセスは死にません(死に際に子プロセスを殺すように書かれている親プログラムはあります)。
Windowsは知りません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java Java 南京錠 2 2023/02/04 11:46
- Windows 10 windows10のクリーンインストールが完了出来ない 2 2022/06/04 13:33
- その他(プログラミング・Web制作) Windows上のプログラム。「予め決められた時刻に自分で起動して処理して自分で終了する」って可能? 3 2023/01/04 14:29
- Java Java 年数計算 3 2023/01/28 10:52
- IT・エンジニアリング 不具合の現状認識をしないプログラマって信用できる人? できない人? 8 2023/07/28 09:09
- その他(プログラミング・Web制作) プログラムの起動、利用について、使用期間を設定する方法 3 2023/08/06 21:03
- その他(コンピューター・テクノロジー) PC利用中に勝手に起動する窓を消し去る方法を教えて下さい。 1 2023/05/08 16:48
- Android(アンドロイド) いま3台のAndroidを使っています。 AndroidってiPhoneには無いmicroSDXCが 1 2022/05/06 11:42
- デスクトップパソコン 「自動修復でPCを修復できませんでした」と表示されPCが起動しないのですが対処法はありますか? 5 2022/05/13 09:16
- その他(社会・学校・職場) 死亡事故(自動車を運転中に歩行者相手の)をした場合、その後関わりを持つ人間にはどのくらいの範囲でその 3 2023/08/24 08:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
時間がかかり過ぎたプロセスを...
-
AIX6でファイルのタイムスタン...
-
open MAILでの"|"
-
例外処理のフローチャートの記...
-
Excel VBAでリンク切れをチェッ...
-
モジュールの最大数はいくつな...
-
Excel VBA 標準モジュール内で...
-
標準モジュールを削除したい。(...
-
LCD ディスプレイを Raspberry ...
-
'Range'メソッドは失敗しました
-
Perl モジュールのアンインスト...
-
VBA This Workbookモジュール...
-
エクセルVBAでシートモジュール...
-
VBAでoutlook365が起動しません。
-
モジュールとは何ですか
-
「デバイスは PRN を初期化でき...
-
オフコン(富士通Kシリーズ)...
-
ユーザー定義関数に#NAME?が返...
-
VBAProjectのモジュ...
-
COBOLで、Shellを起動するには?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
AIX6でファイルのタイムスタン...
-
open MAILでの"|"
-
LinuxにおいてのPerlのプログラ...
-
Perlの処理待ちコマンド
-
Active Directoryでグループに...
-
Perlでexitコードを取得する方法
-
時間がかかり過ぎたプロセスを...
-
実行中のcpan processを終了さ...
-
`ls`標準出力はどこにいった?
-
マルチスレッドとマルチプロセ...
-
system関数とqx演算子の違いに...
-
HELOコマンドが失敗する。
-
Parallel::ForkManagerについて
-
perl から unix コマンドを入...
-
Perlで日本語から始まり記号で...
-
flockの挙動がおかしい。。。
-
macでperl perldocについての...
-
my $pid = open PIPE, "-|";の...
-
Perl はOSによって動作が違った...
-
1行の抜き方とシステム情報の収...
おすすめ情報
windowsです。
すでに解決した可能性はあるのですが、
粗悪なプログラムは気まぐれのように500回に一度程度(?)殺してくれないので、最終的な確認が出来ません。