@synapse_people

Как реализовать процессы, зависящие друг от друга?

Нужно запустить 1 главный процесс, который контролирует множество чилд-процессов..
Он запускает каждый подпроцесс в виде bash -c #CMD#&, получается они работают как таски в текущей сессии. Так вот, #CMD# падает, если завершить главный процесс (логично), но не падает, если убить баш.
Вопрос: можно ли сделать так, чтобы в баше тоже была своя сессия (или как ?), чтобы при убивании главного процесса ИЛИ баша , падало CMD следом за ними?
Иерархия такая: MAINPROC -> BASH -> CMD
вот если сделать kill MAINPROC - должен упасть BASH, а за ним CMD (по логике) - так и происходит, все они ложатся.
Но если убить BASH, то MAIN+CMD все еще работают!
setsid пробовал, тогда если убиваешь BASH+MAINPROC - CMD все дальше себе работает и все, без- них в новой сессии....
Как мне сделать это поведение ?
Подробнее, как сейчас:
7434 pts/0    Ss   00:00:00 bash
16491 pts/0    S    00:00:00  \_ bash
18549 pts/0    S+   00:00:00      \_ php ./...php
18553 pts/0    S+   00:00:00 /bin/bash /tmp/CMDt8sL0c
18559 pts/0    Sl+  00:00:18  \_ /CMD

shift196@debian:/srv/$ kill 18553

shift196@debian:/srv/$ ps --forest -o pid,tty,stat,time,cmd -g 
  PID TT       STAT     TIME CMD
16726 pts/1    Ss   00:00:00 bash
18763 pts/1    R+   00:00:00  \_ ps --forest -o pid,tty,stat,time,cmd -g
 7434 pts/0    Ss   00:00:00 bash
16491 pts/0    S    00:00:00  \_ bash
18549 pts/0    S+   00:00:00      \_ php ./...php
18559 pts/0    Sl+  00:00:20 /CMD

Но CMD не упала,она дальше себе работает!
  • Вопрос задан
  • 301 просмотр
Пригласить эксперта
Ответы на вопрос 2
saboteur_kiev
@saboteur_kiev Куратор тега Linux
software engineer
По логике как раз и не должны фоновые процессы падать, если убит баш.
Об этом и говроит ваш & в конце строки: bash -c #CMD#&

Процессы могут завершаться, если им посылается конкретный сигнал. В группе процессов, сигнал посланный главному процессу также отправляется всем дочерним.
Но в вашем случае в связке: MAIN -> BASH -> CMD вы сами отвязываете дочерний процесс CMD от процесса BASH командой &
При этом MAIN все еще является лидером всей группы процессов, поэтому завершение MAIN влияет на все дочерние.
Ответ написан
@q27off
Вопрос: можно ли сделать так, чтобы в баше тоже была своя сессия (или как ?), чтобы при убивании главного процесса ИЛИ баша , падало CMD следом за ними?

Проблема в том, что вы используете "костыли" для создания дочерних процессов. Используйте системный вызов fork напрямую в своем коде, а не делегируйте это bash.

А вообще, обратите внимание на сисколы setpgid и setpgrp. Можно BASH вынести в отдельную группу, и тогда завершение работы как MAIN так и BASH (с помощью сигнала) приведет к завершению CMD. В первом случае будут завершены все дочерние процессы, т.к. прекратит работу лидер сессии MAIN. Во втором случае будут завершены BASH и CMD, т.к. являются членами одной группы, отличной от группы MAIN. Надеюсь, что понятно изложил свои мысли.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы