哪些规则控制 shell 通过管道启动的进程的父子关系?

哪些规则控制 shell 通过管道启动的进程的父子关系?
#!/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_servicestrace没有多大帮助。我在其输出中找到的唯一有趣的行是:

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 研究)93t+ 2010-02-02

GNU bash,版本 3.2.25(1)-release (i686-redhat-linux-gnu)

答案1

在这种情况下,您的 shellksh是进程的父进程两个都管道的两侧,因为它启动了它们。它在启动一个和另一个之间所做的就是在它们之间建立管道,以便标准输出第一个转到标准输入第二个。

如果您需要在后台运行两进程聚合,则可以这样做:

( my_server_executable 2>&1 | my_pipe_following_shell_script ) &

这将启动两个程序——通过管道连接——在一个子外壳,通过 放入后台&

相关内容