为什么这个在后台运行的脚本能够在调用 shell 的“kill”和终止后继续存在?

为什么这个在后台运行的脚本能够在调用 shell 的“kill”和终止后继续存在?

我有一个脚本

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

在交互式 bash shell 中,我运行

$ ./PDFX.sh &
[1] 21740

然后尝试杀死它

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

显示“已终止”,但程序PDFXCview.exe仍在运行,不受影响,甚至退出 shell 后仍能存活

$ exit
  • wine /home/t/pdfxcview/PDFXCview.exe如果我在脚本中替换为evince,它将无法在kill命令和 shell 终止后继续存在。

  • 如果我wine /home/t/pdfxcview/PDFXCview.exe &直接在交互式 bash shell 中运行,它将无法在kill命令和 shell 终止后继续存在。

我想知道为什么有区别?

我不认为有什么特别之处wine

答案1

跑步

wine /home/t/pdfxcview/PDFXCview.exe

通常会导致许多进程启动,以提供 Windows 二进制文件期望的典型 Windows 环境(explorer.exe等等)。 Wine 通过 启动所有这些进程wineserver,并将它们全部分离——所以它们不是你的 shell 的子进程,甚至也不是 的子进程wineserver。您要求 Wine 运行的二进制文件可以是 shell 的子进程,但它也被否认,因此它可以比其父进程更长寿。退出启动所有这些进程的 shell 不会影响它们。

要杀死一个Windows程序,你需要找到它的pid并直接杀死它。你可以杀全部葡萄酒加工过程采用wineserver -k.

当您运行 时PDFX.sh &,将启动一个新的 shell 来处理脚本,并且该 shell 运行 Wine 来启动PDFXCview.exe。当您运行 时kill %1,您将终止运行脚本的 shell,而不是 Wine 进程。 Wine 进程继续运行(重新将父级设置为 pid 1)。

当您运行时wine /home/t/pdfxcview/PDFXCview.exe &,Wine 进程将直接启动。当您随后运行 时kill %1,您将终止 Wine 进程,从而停止 Windows 程序。如果没有其他 Windows 程序正在运行,wineserver则应立即终止。

相关内容