[Armadillo:08695] Re: Armadillo-460 pppd切断時にpppdがゾンビ化する

Mukai Takanori email@hidden
2013年 3月 21日 (木) 16:01:04 JST


ONICOSの中山様
とし様

向井です。

なんとかPPPDのゾンビプロセスを発生させない事ができました。

対策としては、今までは
電源ON
  ↓
プロセスA起動
    ∟プロセス(a,b,c,d,e)作成: fork, execv使用
          ∟プロセスc: pppdを起動するプロセス

                          から

電源ON
  ↓
プロセスcをバックグラウンド起動: pppdを起動するプロセス
プロセスAをバックグラウンド起動
    ∟プロセス(a,b,d,e)作成: fork, execv使用

とし、最初の起動元から変えてみると、ゾンビを刈り取ることが出来ました。

頂いたご回答、大変参考になりました。

ありがとうございました。

----- Original Message ----- 
From: "nakayama junichi" <email@hidden>
To: "Armadillo general discussion list" <email@hidden>
Sent: Thursday, March 21, 2013 11:08 AM
Subject: [Armadillo:08693] Re:Armadillo-460 pppd切断時にpppdがゾンビ化する


> 向井様
>
> 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 mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
>
> 



armadillo メーリングリストの案内