Agrupe um conjunto de processos de tal forma que quando um morre, o mesmo acontece com todos os outros processos nesse grupo

5

Devido a várias razões, a aplicação que temos consiste em 3 processos que não podem ser transformados em um único. Esses processos são bem justos, então faz sentido desová-los e matá-los juntos. Por exemplo, se algum deles morrer, todo o sistema não funcionará, então faz sentido apenas matar os outros dois.

Isso pode ser feito no Linux?

    
por lolski 25.07.2017 / 17:53

2 respostas

3

Em geral, eu aceito resposta do G-Man . Eu gostaria de apresentar uma solução rápida que pode ser suficiente em algumas circunstâncias.

Deixe os três executáveis em foo , bar e baz . As suposições:

  • você pode executá-los manualmente;
  • você executa todos eles como o mesmo usuário;
  • você gasta no máximo um foo , um bar e um baz a qualquer momento.

Em vez de foo run foo ; killall bar 2>/dev/null .
Em vez de bar run bar ; killall baz 2>/dev/null .
Em vez de baz run baz ; killall foo 2>/dev/null .

Se você deseja executar foo em segundo plano, a sintaxe correta é como:

{ foo ; killall bar 2>/dev/null ; } &

Da mesma forma, com bar e baz . Dessa forma, você pode executá-los a partir de um único shell, se desejar.

A solução é dimensionada para qualquer número razoável de processos. Quando um processo termina, uma cadeia de caracteres em cascata de killall será acionada. Isso acabará por tocar thrash metal matá-los todos.

Note que você não deve iniciar um novo conjunto de processos até ter certeza de que esta cadeia de destruição está concluída.

    
por 26.07.2017 / 01:21
4

Eu não sei de nenhuma maneira de fazer isso diretamente; isto é, ter o Linux lidando com a limpeza do processo automaticamente. Eu acredito que você precisará ter um quarto processo que monitora o status dos outros três e mata os dois restantes quando um morre.

Se é possível ter todos os três processos iniciados pelo mesmo processo pai, essa é provavelmente a melhor abordagem - faça com que o processo pai faça um wait() , que retornará quando qualquer um dos processos filhos terminar. Se isso não é uma opção, escreva um novo programa especificamente para fazer o monitoramento. Você terá que informar os PIDs dos três processos. Pode verificar se eles estão vivos tentando periodicamente enviar sinal 0 para eles. (O processo de monitoramento terá que executar sob o mesmo UID que os outros processos, ou como root (UID 0), para ter permissão para enviar sinais para eles.)

    
por 25.07.2017 / 19:29

Tags