как заставить подоболочку на уровне 2 быть в собственном pgid?

Команда ниже печатает pid подоболочки и подоболочку подоболочки:

$ ( ( echo $BASHPID )& echo $BASHPID )& sleep 1
[1] 9885
9885
9887
[1]+  Done                    ( ( echo $BASHPID ) & echo $BASHPID )

Теперь команда ниже более сложная, но она указывает, что вторая подоболочка находится в «группе процессов» первой подоболочки:

$ ( ( echo $$ $BASH_SUBSHELL $BASHPID ; export BBB=$BASHPID; ps -e -o pid,pgid,ppid,comm | grep -E "$$|$BBB|PGID" | grep -E "bash|PGID" )& echo $$ $BASH_SUBSHELL $BASHPID; sleep 1 )& sleep 1
[3] 9973
2787 1 9973
2787 2 9975
  PID  PGID  PPID COMMAND
 2787  2787  2769 bash
 9973  9973  2787 bash
 9975  9973  9973 bash

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


person noonex    schedule 31.03.2017    source источник


Ответы (1)


Это невозможно сделать, поскольку вы отсоединяете подоболочки от текущего процесса (PGID) с помощью оператора &, поэтому они будут выполняться в отдельном процессе (новый PGID).

Проверьте это также: Как установить группу процессов сценария оболочки

person LMC    schedule 31.03.2017
comment
но почему первая подоболочка имеет собственный PGID, а вторая подоболочка - нет? (и принадлежит первому PGID подоболочки). Другими словами, я хочу еще раз отсоединиться от первого PGID оболочки. - person noonex; 31.03.2017
comment
Ваши подоболочки вложены друг в друга, PPID внешнего - это сама консоль bash, ее PGID - это ее собственный, поскольку он отсоединен. Мне все еще интересно, почему внутренняя подоболочка не имеет собственного жесткого PGID. - person LMC; 03.04.2017
comment
Просто поймите, что я не ответил на ваш вопрос :p - person LMC; 03.04.2017