在命令提示符中终止运行在Wine中的进程

4
我不是Linux或Wine专家...它们是由一个IT人员设置的...我只是一个Java程序员。我正在开发一款在Linux上运行的Java应用程序。它会生成多个线程,这些线程都会执行相同的任务,即生成进程(java.lang.Process),有些是在Linux上,有些是通过Wine在Windows上。其中一些线程在调用Wine时会无限期地挂起。

由于我的多个线程都会调用相同的Linux/Windows应用程序,因此我不能仅通过grep命令来查找wine并终止它,因为这样可能会终止正常运行的wine进程。

我通过反射技术得到了该进程的pid,但它与使用ps命令得到的Linux pid不对应,因此我认为它是在Wine中运行的pid。

(最后的问题...) 是否有一种方法可以通过pid终止在Wine中运行的进程?

4个回答

5

要杀死所有的Wine进程,请使用wineserver -k(在相同的WINEPREFIX环境中)。

要杀死特定的进程(通过winedbg --command "info proc"列出),可以按以下方式运行winedbg

然后以以下方式运行winedbg

$ winedbg
Wine-dbg>info proc
 pid      threads  executable (all id:s are in hex)
 0000000d 4        'taskmgr.exe'
 0000000e 4        'services.exe'
 0000001a 3        \_ 'plugplay.exe'
Wine-dbg>attach 13
0x9f68ad05 read$UNIX2003+0x5 in libsystem_kernel.dylib: call    0x9f68b40c _sysenter_trap in libsystem_kernel.dylib
Wine-dbg>kill
Wine-dbg>quit

attach 接受一个十进制值,你需要将其 pid 从十六进制转换过来,以下是 Bash shell 的示例:

echo $(( 0x0000000d ))

3

1
当你执行kill -3 PID命令时,其中PID是你感兴趣的Wine进程的ID,你将在启动该进程的控制台上获得JVM线程转储。这个转储将包含线程列表及其当前状态,并且将包含nid字段,该字段等于ps -ef -T输出中的SPID字段。

1
感谢您的回复。尝试您建议的方法时,pid未被识别。 -bash-3.2$ kill -3 5245 -bash: kill: (5245) - 没有这个进程虽然这与我在我的OP评论中所说的一致“我能够从进程中获取pid,但它不对应于使用ps的Linux pid”,但在再次查看时,我认为我可能走错了路。也许需要更多的细节...在进程最初启动后,我生成另一个线程,使用缓冲区传输进程的输出流。... - jgreen
当进程返回结果告诉我它已经完成时,我会等待执行流传输的线程完成。执行流传输的线程实际上是发生挂起的地方(如果发生)。我认为某种方式进程输出流没有让缓冲区知道它应该完成(通过返回读取的字节数-1),因此在读取操作上被阻塞。这实际上是我想要杀死的,但我意识到进程pid可能指向任何东西,因为进程已经完成。... - jgreen
我一直认为挂起的流传输会导致进程仍然处于活动状态。如果有的话,我猜我得回到某种 Java 解决方案。 - jgreen

0
如果你感到太沮丧了,试试Windows任务管理器。它应该能够将Wine进程视为本机进程。(当然,它根本看不到其他进程,所以总数不会加起来达到100%)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接