PID de um processo bash não capturado por $!

2

Enquanto esta parte do script funciona bem:

geany &
pid=$!
...
kill -KILL $pid

Isso, ao contrário, não.

lxterminal &
pid=$!
...
kill -KILL $pid

Parece que um processo bash permanece em segundo plano, mas não é identificado por $pid . Como posso obter o PID da janela do terminal, de modo que o processo possa ser morto depois?

Nota: Eu também tentei matar pelo seu nome, mas a opção --title provoca algum tipo de conflito com PROMPT_COMMAND .

    
por nightcod3r 29.12.2016 / 02:02

3 respostas

1

É claro que lxterminal se esquiva de um processo filho. Pense nisso. Esse processo filho é o shell interativo que é anexado ao terminal emulado por lxterminal (ou qualquer outro programa alternativo fornecido com a opção -e ). Ele, por sua vez, faz mais processos netos, dependendo do que se fez naquele shell.

Matar lxterminal fecha o lado mestre do pseudo-terminal que ele usa, que parece um desligamento terminal no que diz respeito ao lado escravo. O lado do escravo é o que o shell interativo vê como seu terminal de controle. Portanto, o shell deve ver um desligamento normal do terminal, gerando um SIGHUP para o líder da sessão se a configuração -hupcl do terminal estiver ativada. Esse líder de sessão é esse processo de shell.

O líder da sessão é responsável pelo controle do trabalho dentro da sessão e por passar o sinal de desligamento para todos os seus trabalhos. Obviamente, se você tiver disown ed algo executado pelo shell, ou nohup ped, o líder da sessão não repassará o sinal de desconexão e que algo continuará a ser executado mesmo que lxterminal tenha sido finalizado eo mestre lado do pseudo-terminal foi fechado. Isso é o que o disown e nohup fazem .

Você precisa descobrir por que o que quer que você esteja executando nessa sessão interativa não está morrendo quando o pseudo-terminal é desligado. Você não nos contou nada sobre o que é isso e não somos telepáticos. Portanto, há pouco a sugerir além das generalidades sobre o que os shells de líderes de sessão são projetados para fazer.

    
por 29.12.2016 / 08:42
0

Como o @ 9000 colocou em um comentário, lxterminal pode ser forking novamente. É mais difícil obter o ID do processo do novo fork, e é por isso que $! não está funcionando.

    
por 29.12.2016 / 05:01
0

Isso pode funcionar. Mas eu não testei isso.

lxterminal &
pid=$!
kill -KILL "$(ps -ho ppid,pid | grep ^$pid | cut -d' ' -f2)"
  • ps -ho ppid,pid obtém PPID (pai PID) e PID dos processos atualmente em execução.
  • Em seguida, grep ^$pid filtra o que não foi bifurcado por $pid , portanto, o lxterminal no plano de fundo.
  • Finalmente, cut seleciona o PID do neto.
por 29.12.2016 / 07:51