パイプを介してシェルが開始したプロセスの親と子の関係を制御する規則は何ですか?

パイプを介してシェルが開始したプロセスの親と子の関係を制御する規則は何ですか?
#!/bin/ksh
# start_service: start the service
my_server_executable 2>&1 | my_pipe_following_shell_script &
exit 0

コマンドラインで上記のスクリプトを実行した後、実行start_service中のプロセスがコマンドを使用する親プロセスであることを確認しました。予想される結果は次のとおりです。psbashmy_pipe_following_shell_scriptmy_server_executableそして必要後者はPID 1()が所有していますinit

これが起こる理由とそれを防ぐ方法の説明を探しています。

また、後で何が起こっているのかをデバッグ/検査するにはどうすればよいですか?ランニングはあまり役に立ちませんstart_serviceでしstraceた。出力で私が見つけた唯一の興味深い行は次のとおりです。

clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb7f05708) = 30431

30431PIDはどこにありますかmy_pipe_following_shell_script


Linux 2.6.18-308.16.1.el5PAE

ksh バージョン sh(AT&T Research) 93t+ 2010-02-02

GNU bash、バージョン 3.2.25(1)-リリース(i686-redhat-linux-gnu)

ベストアンサー1

この場合、シェルはkshプロセスの親です。両方パイプの両側から始まります。一方を開始することと他方を開始することとの間で行うことは、それらの間にパイプを設定することです。標準出力最初に行くには標準入力第二。

バックグラウンドで両方のプロセス集計を実行する必要がある場合は、次のことができます。

( my_server_executable 2>&1 | my_pipe_following_shell_script ) &

これにより、パイプで接続された2つのプログラムが1つで始まります。サブシェル、背景に入れて&

おすすめ記事