我有一个脚本
$ 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
则应立即终止。