Por que esse script rodando em segundo plano pode sobreviver 'kill' e término do shell de invocação?

1

Eu tenho um script

$ cat PDFX.sh 
#! /bin/bash
wine /home/t/pdfxcview/PDFXCview.exe

Em um shell bash interativo, eu corro

$ ./PDFX.sh &
[1] 21740

e tente matá-lo

$ kill $(jobs -p)
[1]+  Terminated              ./PDFX.sh

Ele diz "Terminado", mas o programa PDFXCview.exe ainda está em execução sem ser afetado e pode até sobreviver depois que eu sair do shell

$ exit
  • Se eu substituir wine /home/t/pdfxcview/PDFXCview.exe no script por evince , ele não sobreviverá ao comando kill e ao término do shell.

  • se eu executar wine /home/t/pdfxcview/PDFXCview.exe & diretamente no shell bash interativo, ele não sobreviverá ao comando kill e ao término do shell.

Eu estava me perguntando por que a diferença?

Eu não acho que há algo especial sobre wine .

    
por Tim 05.05.2018 / 16:48

1 resposta

3

Rodando

wine /home/t/pdfxcview/PDFXCview.exe

normalmente resultará em vários processos sendo iniciados, para fornecer o ambiente típico do Windows que um binário do Windows espera ( explorer.exe etc.). O Wine inicia todos estes processos via wineserver , e separa todos eles - então eles não são filhos da sua casca, nem mesmo de wineserver . O binário que você pediu ao Wine para ser executado pode ser um processo filho do shell, mas também é rejeitado para que possa sobreviver ao pai. Sair do shell a partir do qual você iniciou todos esses processos não os afeta.

Para matar um programa do Windows, você precisa encontrar o seu pid e matá-lo diretamente. Você pode matar todos processos do Wine com wineserver -k .

Quando você executa PDFX.sh & , um novo shell é iniciado para processar o script e esse shell executa Wine para iniciar PDFXCview.exe . Quando você executa kill %1 , está eliminando o shell que está executando o script, não o processo do Wine. O processo do Wine continua em execução (re-parented para pid 1).

Quando você executa wine /home/t/pdfxcview/PDFXCview.exe & , o processo do Wine é iniciado diretamente. Quando você executar kill %1 , estará eliminando o processo do Wine, que interrompe o programa do Windows. Se nenhum outro programa do Windows estiver em execução, wineserver deve terminar logo em seguida.

    
por 05.05.2018 / 17:27