バックグラウンドで実行されるこのスクリプトがシェルを "kill" 呼び出して終了しても生き残ることができるのはなぜですか。

バックグラウンドで実行されるこのスクリプトがシェルを "kill" 呼び出して終了しても生き残ることができるのはなぜですか。

スクリプトがあります

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

対話型 bash シェルで、次を実行します。

$ ./PDFX.sh &
[1] 21740

それでは殺してみてください。

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

「終了しました」と表示されますが、プログラムはPDFXCview.exe影響を受けずに実行され続け、シェルを終了した後も生き残ることができます。

$ exit
  • wine /home/t/pdfxcview/PDFXCview.exeスクリプトを置き換えても、コマンドとシェルのシャットダウンは維持evinceされません。kill

  • wine /home/t/pdfxcview/PDFXCview.exe &対話型 bash シェルから直接実行しても、killコマンドとシェルの終了は維持されません。

なぜ違いがあるのか​​知りたいです。

私はそれについて特別なことがないと思いますwine

答え1

走る

wine /home/t/pdfxcview/PDFXCview.exe

explorer.exe通常、Windowsバイナリ(など)が期待する一般的なWindows環境を提供するために、いくつかのプロセスが開始されます。 Wineはこれらすべてのプロセスを開始し、すべてをwineserver分離することによってこれを行います。したがって、そのプロセスはシェルでもシェルの子プロセスでもありませんwineserver。 Wineに実行を要求したバイナリは、シェルの子プロセスである可能性がありますが、親プロセスよりも長く続く可能性があることも拒否されました。これらすべてのプロセスを開始したシェルを終了しても影響はありません。

Windowsプログラムを終了するには、そのプログラムのpidを見つけて直接終了する必要があります。あなたは殺すことができますみんなワイン加工プロセスではwineserver -k

を実行すると、PDFX.sh &スクリプトを処理するために新しいシェルが起動し、そのシェルはWineを実行して起動しますPDFXCview.exe。を実行すると、kill %1Wine プロセスではなくスクリプトを実行しているシェルが終了します。 Wineプロセスは引き続き実行されます(pid 1に変更されます)。

を実行するとwine /home/t/pdfxcview/PDFXCview.exe &Wine プロセスが直接起動します。後で実行するとkill %1Wine プロセスが終了し、Windows プログラムが停止します。実行中の他のWindowsプログラムがない場合は、wineserverすぐに終了してください。

関連情報