[Armadillo:08693] Re: Armadillo-460 pppd切断時にpppdがゾンビ化する
nakayama junichi
email@hidden
2013年 3月 21日 (木) 11:08:07 JST
向井様
ONICOSの中山です。
>> また、向井さんの環境ですと、
>> 親プロセスに直接killコマンドでSIGCHLDを送れば、
>> 強制的にpppdに対してwaitできるはずです。
> → 1.pppdを呼び出したプロセスにSIGCHLDの受信ハンドラを設定
> ・・・・
> 2.kill( pppdのPID, SIGINT ) ;
> 3.kill( pppdを呼び出したプロセスのPID, SIGCHLD ) ;
> ・・・・
> 4.SIGCHLDハンドラ内で
> waitpid( -1, NULL, WNOHANG ) ;
>
> という処理を入れてみたのですが駄目でした。
> こちらも意図が違いましたでしょうか。
少し違います。
ゾンビプロセスが存在している状態で、
pppdを呼び出した親プロセスに対して、
コンソールから
kill -CHLD ***
というコマンドを投入するということです。
(***にはpppdを呼び出したプロセスのPIDを指定してください)
このコマンドを投入するたびに、
pppdのゾンビがひとつずつ減っていくはずです。
--------------------------------------------------
From: "Mukai Takanori" <email@hidden>
Sent: Tuesday, March 19, 2013 6:00 PM
To: "Armadillo general discussion list" <email@hidden>
Subject: [Armadillo:08690] Re:Armadillo-460 pppd切断時にpppdがゾンビ化する
> 中山様
>
> 向井です。
>
> 頂いたご回答に対する当方の認識が間違えているのか、まだ解決しません。
>
>> 親プロセスからkillされているのでしょうか?
> → ここで言われている親プロセスとは、pppdを呼び出したプロセスの事でしょうか。
>
> その場合は親プロセスがpppdをkillしております。
>
>> その場合はkill()直後にwaitpid()を呼び出し、
>> (-1ではなく)pppdのPIDを指定して回収できます。
> → kill( pppdのPID, SIGINT ) ;
> waitpid( pppdのPID, NULL, WNOHANG ) ;
> というコードで試してみましたがだめでした。
> 意図が違いましたでしょうか。
>
>> また、向井さんの環境ですと、
>> 親プロセスに直接killコマンドでSIGCHLDを送れば、
>> 強制的にpppdに対してwaitできるはずです。
> → 1.pppdを呼び出したプロセスにSIGCHLDの受信ハンドラを設定
> ・・・・
> 2.kill( pppdのPID, SIGINT ) ;
> 3.kill( pppdを呼び出したプロセスのPID, SIGCHLD ) ;
> ・・・・
> 4.SIGCHLDハンドラ内で
> waitpid( -1, NULL, WNOHANG ) ;
>
> という処理を入れてみたのですが駄目でした。
> こちらも意図が違いましたでしょうか。
>
> 以上、よろしくお願いします。
>
> ----- Original Message -----
> From: "nakayama junichi" <email@hidden>
> To: "Armadillo general discussion list"
> <email@hidden>
> Sent: Tuesday, March 19, 2013 4:00 PM
> Subject: [Armadillo:08688] Re:Armadillo-460 pppd切断時にpppdがゾンビ化する
>
>
>> 向井様
>>
>> ONICOSの中山です。
>>
>>> 中山様に提案していただいた対策をいれてみたのですが、
>>> やはりゾンビプロセスが増え続けています。
>>>
>>> ちなみにですが、vfork()とexeclp()を使用する方法の場合、
>>> 親プロセス側でシグナル受信(SIGCHLD等)は入れて、
>>> ハンドラ内でwaitをして有りますでしょうか。
>>
>> 私の場合、少し特殊かもしれませんが、
>> 親プロセスが複数(10個以上)の子プロセスを
>> 管理するような構造になっています。
>> 親プロセスはループしながら絶えず
>> waitpid(-1, &status, WNOHANG)
>> を呼び続けています。
>> SIGCHLDの受信はしていません。
>>
>> 子プロセスを外部から荒っぽくkill()しても
>> 親プロセスがkillされたゾンビプロセスを
>> うまい具合に回収してくれます。
>>
>> 親プロセスからkillされているのでしょうか?
>> その場合はkill()直後にwaitpid()を呼び出し、
>> (-1ではなく)pppdのPIDを指定して回収できます。
>>
>> また、向井さんの環境ですと、
>> 親プロセスに直接killコマンドでSIGCHLDを送れば、
>> 強制的にpppdに対してwaitできるはずです。
>>
>>
>> --------------------------------------------------
>> From: "Mukai Takanori" <email@hidden>
>> Sent: Tuesday, March 19, 2013 3:08 PM
>> To: "Armadillo general discussion list"
>> <email@hidden>
>> Subject: [Armadillo:08687] Re:Armadillo-460 pppd切断時にpppdがゾンビ化する
>>
>>
>>> 中山様
>>>
>>> 向井です。
>>> ご回答ありがとうございました。
>>>
>>> 中山様に提案していただいた対策をいれてみたのですが、
>>> やはりゾンビプロセスが増え続けています。
>>>
>>> ちなみにですが、vfork()とexeclp()を使用する方法の場合、
>>> 親プロセス側でシグナル受信(SIGCHLD等)は入れて、
>>> ハンドラ内でwaitをして有りますでしょうか。
>>>
>>> 以上、よろしくお願いします。
>>>
>>> ----- Original Message -----
>>> From: "nakayama junichi" <email@hidden>
>>> To: "Armadillo general discussion list"
>>> <email@hidden>
>>> Sent: Tuesday, March 19, 2013 11:09 AM
>>> Subject: [Armadillo:08682] Re:Armadillo-460 pppd切断時にpppdがゾンビ化する
>>>
>>>
>>>> 向井様
>>>>
>>>> ONICOSの中山と申します。
>>>>
>>>>> Armadillo-460にて、FOMA通信を行う為ppp接続しています。
>>>>> 動作確認用のプログラム内(別プロセスからforkされています)で、以下処理をループで繰り返しています。
>>>>> ============================================================
>>>>> 1.ppp接続(バックグラウンドでpppd起動):system()関数からpppdを起動しています。
>>>>
>>>> system()関数で別プロセスを起動するのではなく、
>>>> vfork()とexeclp()を使用する方法はどうでしょうか?
>>>> 以下のように、
>>>> vfolk()は引数なしで呼び出します。
>>>> execlp()のほうは引数をいくつか与える必要があります。
>>>>
>>>> pid = vfork();
>>>> if( pid == 0 )
>>>> {
>>>> // Child process
>>>> execlp("pppd", "pppd", NULL);
>>>> return;
>>>> }
>>>> else
>>>> {
>>>> // Parent process
>>>> }
>>>>
>>>> 440なのですが、私はこの方法でプロセス管理ができています。
>>>>
>>>>
>>>> --------------------------------------------------
>>>> From: "Mukai Takanori" <email@hidden>
>>>> Sent: Tuesday, March 19, 2013 10:45 AM
>>>> To: <email@hidden>
>>>> Subject: [Armadillo:08681]Armadillo-460 pppd切断時にpppdがゾンビ化する
>>>>
>>>>> お世話になります。
>>>>> 向井と申します。
>>>>>
>>>>> Armadillo-460にて、FOMA通信を行う為ppp接続しています。
>>>>> 動作確認用のプログラム内(別プロセスからforkされています)で、以下処理をループで繰り返しています。
>>>>> ============================================================
>>>>> 1.ppp接続(バックグラウンドでpppd起動):system()関数からpppdを起動しています。 ↓
>>>>> 2.pppセッション確立を確認。
>>>>> ↓
>>>>> 3.ppp切断:kill(pppdのpid, SIGINT) ←で切断しています。
>>>>> ============================================================
>>>>>
>>>>> 3.の時点でpppのセッションは切れているのですが、その後にpsコマンドでプロセスを確認すると、
>>>>> pppdのゾンビプロセスが増え続けてしまいます。
>>>>>
>>>>> 対策として以下を試してみましたが、ゾンビプロセスを消すことが出来ません。
>>>>> 1.SIGCHLDハンドラ内で waitpid( -1, NULL, WNOHANG ) を実施。
>>>>> 2.デーモンのシグナルを無視する。 signal( SIGCHLD, SIG_IGN )
>>>>> 3.kill(pppdのpid, SIGINT) を system( "kill -9 pppdのpid" ) に変更してみる。
>>>>>
>>>>> 何か別の対策法をご存じの方がおられましたら、ご教示をお願いします。
>>>>>
>>>>> 環境:
>>>>> カーネルバージョン:linux-2.6.26-at15
>>>>> pppd バージョン:2.4.2
>>>>>
>>>>> 以上、よろしくお願いします。
>>>>>
>>>>>>> ********************************
>>>>>>> 〒655-0894
>>>>>>> 神戸市垂水区川原2−2−7
>>>>>>>
>>>>>>> 株式会社サイ電子
>>>>>>> 向井 隆智
>>>>>>>
>>>>>>> TEL 078-754-0738 FAX 078-754-0913
>>>>>>> http://www.sai-inc.jp
>>>>>>> ********************************
>>>>>
>>>>
>>>>
>>>>
>>>>> _______________________________________________
>>>>> armadillo mailing list
>>>>> email@hidden
>>>>> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
>>>>>
>>>> _______________________________________________
>>>> armadillo mailing list
>>>> email@hidden
>>>> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
>>>>
>>>>
>>>
>>> _______________________________________________
>>> armadillo mailing list
>>> email@hidden
>>> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
>>
>> _______________________________________________
>> armadillo mailing list
>> email@hidden
>> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
>>
>>
>
> _______________________________________________
> armadillo mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
armadillo メーリングリストの案内