Jak zabić procesy winiarskie, gdy ulegają awarii lub zamierzają upaść?

15

Czasami zdarza się, że aplikacja Wine ulega awarii (spowalnia system i czyni go prawie bezużytecznym). W większości przypadków jestem w stanie zabić program xkill, ale czasami muszę zrestartować, ponieważ Ubuntu wydaje się nie reagować zbyt dobrze (jedyne, co działa, to ALT+ F2, program uruchamiający; xkillnie działa). Próbowałem do użytku wineboot -rlub -fale nie wydają się działać bardzo dobrze .. Jeśli coś jest niejasne, daj mi znać, postaram się wyjaśnić lepiej :)

Hadden
źródło

Odpowiedzi:

13
killall nameofexefile.exe

podobnie jak procesy linuxowe

Conor Rynne
źródło
czy to tylko dla wina czy dla całego procesu w Linuksie?
sierpnia
to zabije każdy proces, okna za pomocą wina lub linuksa
Conor Rynne,
1
Więc wineserver -k zabije wszystkie procesy winiarskie ... to miałem na myśli ... Nie używam killall <plik> .exe tak często nie znam dokładnej nazwy pliku (i kiedy system oszaleje W każdym razie nie będę wiedzieć)
Hadden,
ahhh właśnie wtedy wineserver -k prawdopodobnie wykona zadanie. Uważaj, aby nie otworzyć żadnych innych procesów związanych z winem, w tym programów w PlayOnLinux i Crossover.
Conor Rynne,
34

Możesz bezpiecznie zabijać sesje win albo za pomocą ALT + F2 lub przez terminal, pisząc

wineserver -k

Jeśli tak naprawdę nie chce się zamknąć, możesz to wymusić

wineserver -k9
fossfreedom
źródło
4

Cóż, jako programista wina, często chrzanię to cholerstwo, więc używam mojego super specjalnego skryptu killwine. To ciężka śmierć ( wineserver -kjest to dobry sposób na zrobienie tego i zawsze preferowane).

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

Zakłada się, że prefiksy wina są poniżej ~/.local/share/wine. Przykłady użycia to:

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.

Nie wiem, ale nie sądzę, że często kończysz się różnymi procesami zawieszonymi w pamięci (o co ten skrypt się zajmuje) w normalnym lub nawet normalnym + wersji przejściowej, ale robię całkiem sporo z powodu włamywanie się do serwera i ntdll.

EDYCJA: Ten skrypt działa tylko w systemie operacyjnym Linux i zakłada, że ​​system plików proc jest zamontowany na / proc itp.

Daniel Santos
źródło
Działa jak urok, podczas gdy wineserver -k lub -k9 nie powiodło się.
Michael-AD
Ach, dzięki! Wygląda na to, że zgubiłem kopię tego skryptu i teraz mam go ponownie! Powinienem wspomnieć, że będzie to działać tylko w systemie operacyjnym opartym na Linuksie, ponieważ przegląda on / proc.
Daniel Santos
2

Moja wersja:

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

Zabija wszystkie procesy winiarskie. Dzięki temu postowi /ubuntu//a/732320/605355

Andrey Dovbyshko
źródło
lol, to fragment mojego skryptu! :) Właśnie zmienili go na potok na xargs zamiast podpowłoki bash - to dobrze, ponieważ będzie również działać z / bin / sh. Nadal miałem pewne procesy, które nie umarły, gdy zawieszają się przed zakończeniem procesu inicjowania rzeczy w ntdll. Może powinienem spróbować przesłać mój skrypt lub jego wcielenie do głównej linii. EDYCJA: Rozumiem, to twoja zmodyfikowana wersja :)
Daniel Santos
1

Właśnie miałem mieć ten sam problem. To polecenie w terminalu pomogło mi. Naciśnij Ctrl + Alt + t, a następnie wpisz następujące polecenie:
ps -x | grep "Your program name" | awk '{print $1}' | xargs kill

Nazwa twojego programu powinna być napisana bez cudzysłowów. Pomogło mi to rozwiązać oblivion.exe:
ps -x | grep Oblivion | awk '{print $1}' | xargs kill

Łukasza 359
źródło