(我不是一个Linux或葡萄酒专业人员…他们是由一个IT人员build立的……我只是一个Java人)我正在开发一个运行在Linux上的Java应用程序。 它产生了几个线程,做同样的事情,即产卵进程(java.lang.Process),一些Linux,通过葡萄酒一些Windows。 我的一些线程将在葡萄酒调用期间无限期地挂起。
因为我有几个线程去调用相同的Linux / Windows应用程序,我不能只是grep的酒输出ps和杀死,因为我可以杀死葡萄酒进程是好的。
有一些使用Googlesearch,通过反思,我能够从过程中获得pid,但它不符合使用ps的Linux pid,所以我认为这是一个在酒中运行的pid。
(最后的问题…)有没有办法杀死一个进程在葡萄酒引用它的PID?
至少在最近的版本中,Wine自带有taskmgr和taskkill ,类似于Windows上同名的程序。
要杀死所有的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 ))
当你kill -3 PID
,其中PID是你感兴趣的Wine进程id时,你将在启动该进程的控制台上获得JVM线程转储。 该转储将包含具有其当前状态的线程列表,并且将包含等于ps -ef -T
输出中的SPID字段的nid
字段。
如果您太沮丧,请尝试使用Windows任务管理器。 它应该能够看到葡萄酒过程是原生的。 (当然不会看到别人,所以总数不会达到100%)。