Какие правила определяют отношения между родителями и дочерними процессами, запущенными оболочкой через трубу?

#!/bin/ksh # start_service: start the service my_server_executable 2>&1 | my_pipe_following_shell_script & exit 0 

После запуска вышеуказанного скрипта start_service из командной строки, с помощью команды ps вызывается, что процесс bash выполняющий my_pipe_following_shell_script является родителем my_server_executable , тогда как я ожидал бы и нуждался бы , чтобы последний принадлежал PID 1 ( init ).

Я ищу объяснение, почему это произошло и как я могу избежать этого .

Также как можно отлаживать / анализировать то, что происходит за кадром? Запуск start_service с strace не очень полезен. Единственная интересная строка, которую я смог найти в ее выходе:

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

где 30431 – это PID my_pipe_following_shell_script .


Linux 2.6.18-308.16.1.el5PAE

ksh Version sh (AT & T Research) 93t + 2010-02-02

GNU bash, версия 3.2.25 (1) -release (i686-redhat-linux-gnu)

Ваша оболочка – ksh в этом случае – является родителем процессов на обеих сторонах канала, потому что они запустили их оба. Все, что происходит между запуском одного и другого, – это установить между ними трубку, так что выступление первого идет на stdin второго.

Если вам нужна операция двухступенчатой ​​агломерации, которая будет выполняться в фоновом режиме, это сделает это:

 ( my_server_executable 2>&1 | my_pipe_following_shell_script ) & 

Это запускает две программы – связанные через трубу – внутри подоболочки , которая помещается в фоновое изображение через & .