メッセージ

2023年02月26日の記事

2023/02/26(日)perl で子プロセスで su を実行させると、親プロセスも道づれで消える

ごく単純と思われる、サーバプログラムで、
     《起 動》
       ↓
  ┌─→《接続要求待ち》 ← LAN・WANからの接続要求
  │    ↓
  │  《接続応答》
  │    ↓
  │  《子プロセスをfork()》→────┐
  │    ↓(親プロセス)      │(子プロセス)
  │    │             ↓
  │    │           《実処理》
  │    │             │
  |  《子プロセス終了待ち》←──《処理終了》
  │    ↓
  └←《次の接続を待つ》
のような概略構造で、 root 権限で稼働させる代物だが、この構造で、子プロセス内で、perl にて

$status = system (/usr/bin/su username -c "exec comannd ... ") ;

または

$result = `/usr/bin/su username -c "exec comannd ... "`

みたいなことをやらせると、当該処理は実行するものの、実行後、親プロセスまでも終了してしまう。
どちらも更に子プロセスを起こし、 username 権限で実行するというところまでは各所に記載があるため判るが、処理終了時の動作については記載が見当たらず、これ以上の調査に時間を費やせないという現実。

結局、su をやめ、root 権限で動作させ、実行後、このプログラムで生成された必要なファイルを chown するという策で回避。
バグなのかもしれないが、何かやらかしてなるべきしてこうなっているかも知れずで、よく判らないところですね。