PR_SET_CHILD_SUBREAPER
私のスクリプトを実行しているBashプロセスのプロセスフラグを設定して、その寿命の間に生成されたサブプロセスのツリーを取得できるようにしたいと思います(順序なしで終了することができます)。基本的にBashは自分自身を呼び出すことができるようにしたいprctl(PR_SET_CHILD_SUBREAPER, 1, 0, 0, 0);
が、これを達成する方法が見つかりませんでした。どんな提案がありますか?
Bashの組み込み機能がある場合は、libc.so.6
prctl()
直接呼び出し(Pythonなど)に関連する狡猾なソリューションを使用してもかまいません。ctypes
ベストアンサー1
これが問題にならないと言われたので、bashに対応する機能を導入する必要性を感じます。
ctypes.sh、bashの外部機能インターフェース
BashメカニズムをロードするBash共有オブジェクトプラグインですenable -f
。
enable [-a] [-dnps] [-f filename] [name ...]
この
-f
オプションは、動的ロードをサポートするシステムの共有オブジェクトファイル名から新しい組み込みコマンド名をロードすることを意味します。
そしてC言語で実装しました。少なくとも、ほとんどのLinuxディストリビューションとFreeBSDで動作します。
あなたはする必要がありますコンパイルとインストール最初。主な機能は、シェルでほぼすべてのライブラリ呼び出しまたはシステム呼び出しを使用できることです。struct
組み込み関数が構造を自動的に再構成できない場合、構造を必要とする呼び出しはより複雑になる可能性があります。
amd64(x86_64) アーキテクチャと Linux カーネル 5.6 で現在 bash シェルに入力されている例
$ source /usr/local/bin/ctypes.sh
$ dlcall -r int prctl int:36 ulong:1 ulong:0 ulong:0 ulong:0
int:0
$ echo $DLRETVAL # you can't use $() above to get the result since that would be a subshell
int:0
$ echo $$; bash -c 'echo $$; sleep 99 & echo $!; disown -a'
14767
16761
16762
$ pstree -p $$
bash(14767)─┬─pstree(16778)
└─sleep(16762)
sleep
親プロセス(pid 16761)を失ったプロセスは、bash
initプロセスの代わりに現在のシェルに継承されました。働いた。
このシステムの値(およびタイプ)PR_SET_CHILD_SUBREAPER
に置き換える必要があります。/usr/include/linux/prctl.h
#define PR_SET_CHILD_SUBREAPER 36
正しく使用するには、マニュアルを確認する必要があります。
また、シェルの標準が期待wait
どおりに機能しない場合があります。シェルはsleep
コマンドを生成しないので、wait
コマンドは何もしません。 dlcallingに投資したいかもしれませんwait()
bash自体が設定を変更し、コマンドが実行されるたびに-likeを呼び出すため、これらの継承されたプロセスで予期しない対話が発生する可能性があるため、これはwaitpid()
困難です。wait()
使用データベース
これにより、以前と同じ結果が得られます(あまり冗長にするためのいくつかのオプションが必要です)。
$ gdb -ex 'call (int)prctl((int)36,(long)1,(long)0,(long)0,(long)0)' -ex detach -ex quit -p $$