如何在Wine进程崩溃或即将崩溃时终止它们?

有时候会发生Wine应用程序崩溃的情况(导致系统变慢,几乎无法使用)。 在大多数情况下,我可以用"xkill"来终止程序,但有时我不得不重新启动Ubuntu,因为它似乎不太好响应(唯一有效的是ALT+F2,启动器;"xkill"无效)。 我尝试过使用"wineboot -r"或"-f",但它们似乎效果不佳。 如果有什么不清楚的地方,请告诉我,我会尽量解释得更清楚 :)
5个回答

你可以通过ALT+F2或者在终端中输入命令来安全地关闭wine会话。
wineserver -k

如果它真的不想关机,那么你可以通过强制关机来实现。
wineserver -k9

3我执行了这些命令之后,仍然看到winedevice.exe在运行。 - Dan Dascalescu

killall nameofexefile.exe

就像Linux进程一样


这是只适用于葡萄酒还是适用于Linux中的所有运行进程? - 13east
这将终止任何进程,无论是通过Wine运行的Windows程序还是Linux系统。 - Conor Rynne
2所以wineserver -k会杀掉所有的wine进程...这就是我想说的... 我不经常使用killall <file>.exe,因为我不知道文件的确切名称(而且当系统出问题时,无论如何我也不会知道)。 - Hadden
啊,那么在这种情况下,wineserver -k 可能会完成工作。只要小心,确保没有其他的 Wine 进程正在运行,包括 PlayOnLinux 和 Crossover 中的程序。 - Conor Rynne

嗯,作为一个酒程序员,我经常会把整个该死的东西搞砸,所以我使用我的超级特殊的killwine脚本。这是一种彻底的死亡(wineserver -k是一种好的方式,也是首选)。
#!/bin/bash

wine_cellar="${HOME}/.local/share/wine"

if (($#)); then
    if [[ -e "${wine_cellar}/$1" ]]; then
        WINEPREFIX="${wine_cellar}/$1"
        shift
    elif [[ "${1:0:1}" != "-" ]]; then
        echo "ERROR: Didn't understand argument '$1'?" >&2;
        exit 1
    fi
fi

if ((${#WINEPREFIX})); then
    pids=$(
        grep -l "WINEPREFIX=${WINEPREFIX}$" $(
            ls -l /proc/*/exe 2>/dev/null |
            grep -E 'wine(64)?-preloader|wineserver' |
            perl -pe 's;^.*/proc/(\d+)/exe.*$;/proc/$1/environ;g;'
        ) 2> /dev/null |
        perl -pe 's;^/proc/(\d+)/environ.*$;$1;g;'
    )
else
    pids=$(
        ls -l /proc/*/exe 2>/dev/null |
        grep -E 'wine(64)?-preloader|wineserver' |
        perl -pe 's;^.*/proc/(\d+)/exe.*$;$1;g;'
    )
fi

if ((${#pids})); then
    set -x
    kill $* $pids
fi

这假设你的Wine前缀位于~/.local/share/wine下。使用示例如下:
killwine                       # Just kill all instances of wine
killwine -9                    # Hard kill them all
killwine lotro                 # Only kill wine under ${HOME}/.local/share/wine/lotro
killwine -INT lotro            # Same as above, but use SIGINT
WINEPREFIX=/tmp/crap killwine  # Kill only the instance under /tmp/crap
sudo reboot                    # Pretend you're running windows.

我不知道,但我不认为你会经常在内存中遇到各种挂起的进程(这个脚本负责处理)在正常或者正常+演示版本上,但是因为黑客攻击服务器和ntdll,我确实经常遇到这种情况。
编辑:这个脚本只能在基于Linux的操作系统上运行,并且假设proc文件系统被挂载在/proc等位置。

运行得很顺利,而wineserver -k或-k9则没有成功。 - Michael-A-D
啊,谢谢!我好像把这个脚本的副本弄丢了,现在我又有了!我应该提醒一下,这只能在基于Linux的操作系统上运行,因为它会搜索/proc目录。 - Daniel Santos

我的版本:

ls -l /proc/*/exe 2>/dev/null | grep -E 'wine(64)?-preloader|wineserver' | perl -pe 's;^.*/proc/(\d+)/exe.*$;$1;g;' | xargs -n 1 kill

它可以终止所有的酒进程。感谢这篇帖子https://askubuntu.com/a/732320/605355

哈哈,那是我剧本中的一段! :) 他们只是将它改为使用管道传递给 xargs,而不是使用 bash 子shell——这很好,因为它还可以在 /bin/sh 中工作。但有时候,我发现一些进程在 ntdll 中的进程初始化部分完成之前挂起时没有终止。也许我应该尝试提交我的脚本,或者提交其中的某个版本到主线。编辑:哦,我明白了,那是你修改过的版本 :) - Daniel Santos

我刚好也遇到了同样的问题。 终端中的这个命令帮助了我。按下 Ctrl + Alt + t,然后输入以下内容:
ps -x | grep "你的程序名称" | awk '{print $1}' | xargs kill

你的程序名称应该不加引号写入, 它帮助我解决了 oblivion.exe 问题:
ps -x | grep Oblivion | awk '{print $1}' | xargs kill


  • 相关问题