スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

サブシェルをkillするとinitプロセスの子プロセスになる

以下のようなシェルを作ったのですが。。。。
子シェルを作って、子シェルのプロセスIDをPIDに格納。
それをkill。その後pstreeで見ると、sleepプロセスがinitの子として残っている。

#!/bin/bash

(sleep 30;echo hoge) &

PID=$!
pstree -p
echo $PID

kill $PID

sleep 10
pstree -p | grep sleep



14363をkillしても、14365がinitの子プロセスとして残ってしまうという現象です。

test.sh(14362)━┳━stree(14364)
           ┗━test.sh(14363)━━sleep(14365)



init(1)━━sleep(14365)




さて、同じような現象で悩んでいる質問を発見しました。

http://lists.gnu.org/archive/html/bug-bash/2007-03/msg00018.html

しかし、回避方法はよくわからなかった。

こちらの記事では”孤児プロセス”(Orphan process)と呼ぶことが分かった。
http://www.programmingforums.org/post226241.html

で、、結局親のプロセスIDから子のプロセスIDを求めておいて、
親子共々葬るというかたちを考えてみた。これでOKだろう。

#!/bin/bash


(sleep 30;echo hoge > /tmp/hoge.txt) &

PID=$!
echo $PID

#子のプロセスIDを求めて保存
CPID=`ps l --ppid=$PID | grep sleep | awk '{print $3}'`
echo $CPID

pstree -p

#親を殺す
kill $PID
#子も殺す
kill $CPID

sleep 10
pstree -p | grep sleep

スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

鈍足ランナー

Author:鈍足ランナー
作成アプリ

Learn from AlphaGeeks
Twinani


最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。