Comment tuer les processus Wine quand ils plantent ou vont planter?

15

Il arrive parfois qu'une application Wine se bloque (ralentissant le système et le rendant presque inutilisable). Dans la plupart des cas, je suis capable de tuer le programme avec xkill, mais parfois je dois redémarrer car Ubuntu ne semble pas très bien répondre (la seule chose qui fonctionne est ALT+ F2, le lanceur; xkillnon). J'ai essayé d'utiliser wineboot -rou -fmais ils ne semblent pas très bien fonctionner .. Si quelque chose n'est pas clair, faites le moi savoir que j'essaierai de mieux l'expliquer :)

Hadden
la source

Réponses:

13
killall nameofexefile.exe

tout comme les processus Linux

Conor Rynne
la source
est-ce juste pour le vin ou pour tous les processus en cours d'exécution sous linux?
13
cela tuera tout processus, fenêtres via wine ou linux
Conor Rynne
1
Donc vinserver -k va tuer tous les processus de vin ... c'est ce que je voulais dire ... Je n'utilise pas killall <fichier> .exe car souvent je ne connais pas le nom exact du fichier (et quand le système devient fou Je ne saurai en aucun cas)
Hadden
ahhh alors dans ce cas, le serveur de vins -k fera probablement le travail. Faites juste attention à ce qu'aucun autre processus Wine ne soit ouvert, qui inclut également des programmes dans PlayOnLinux et Crossover.
Conor Rynne
34

Vous pouvez tuer des sessions Wine en toute sécurité via ALT + F2 ou via un terminal en tapant

wineserver -k

S'il ne veut vraiment pas s'arrêter, vous pouvez le forcer via

wineserver -k9
liberté de fossé
la source
4

Eh bien, en tant que programmeur de vin, je vais souvent foutre le bordel, donc j'utilise mon script killwine super spécial. C'est une mort difficile ( wineserver -kc'est la bonne façon de le faire et toujours préférée).

#!/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

Cela suppose que vos préfixes de vin sont inférieurs ~/.local/share/wine. Les exemples d'utilisation sont:

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.

Je ne sais pas, mais je ne pense pas que vous vous retrouverez souvent avec divers processus bloqués en mémoire (ce dont ce script s'occupe) sur une version normale ou même normale + staging, mais je fais beaucoup à cause de piratage du serveur et ntdll.

EDIT: ce script ne fonctionnera que sur un système d'exploitation basé sur Linux et suppose que le système de fichiers proc est monté sur / proc, etc.

Daniel Santos
la source
Fonctionne comme un charme, tandis que wineerver -k ou -k9 n'a pas réussi.
Michael-AD
Ahh, merci! Il me semble avoir perdu ma copie de ce script et maintenant je l'ai à nouveau! Je dois mentionner que cela ne fonctionnera que sur un système d'exploitation Linux, car il fouille dans / proc.
Daniel Santos
2

Ma version:

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

Il tue tous les processus viticoles. Merci à ce post /ubuntu//a/732320/605355

Andrey Dovbyshko
la source
lol, c'est un extrait de mon script! :) Ils l'ont juste changé en pipe en xargs au lieu d'un sous-shell bash - c'est bien car cela fonctionnera également avec / bin / sh. Cependant, certains processus ne sont pas morts lorsqu'ils se bloquent avant de terminer le processus d'initialisation du processus dans ntdll. Je devrais peut-être essayer de soumettre mon script, ou une incarnation de celui-ci à la ligne principale. EDIT: Oh, je vois, c'est votre version modifiée :)
Daniel Santos
1

J'étais sur le point d'avoir le même problème. Cette commande dans le terminal m'a aidé. Appuyez sur Ctrl + Alt + t, puis écrivez ce qui suit:
ps -x | grep "Your program name" | awk '{print $1}' | xargs kill

Le nom de votre programme doit être écrit sans guillemets , cela m'a aidé à résoudre oblivion.exe:
ps -x | grep Oblivion | awk '{print $1}' | xargs kill

Luke359
la source