Gibt es etwas Stärkeres als "Force Quit"?

24

Ich habe eine App, die nicht stirbt: Sie ist vom Dock verschwunden, aber das Fenster bleibt (mit einem Beachball, wenn ich mit der Maus darüber fahre). Es verbraucht keine CPU, aber ich möchte, dass es verschwindet.

Gibt es etwas Stärkeres als "Force Quit", um eine App wirklich wirklich zu töten?

Ken
quelle
Ich bin mir nicht sicher, ob es stärker ist, aber versuche es mit Apps> Dienstprogramme> Aktivitätsmonitor. Suchen Sie den Prozess und erzwingen Sie das Beenden. Wenn das nicht funktioniert, notieren Sie sich die Prozessnummer, gehen Sie zum Terminal und geben Sie "kill #" ein, wobei # die Prozessnummer ist. HTH
David DelMonte
6
der Netzschalter?
Daniel
1
@DanielLawson Leider führen diese Situationen normalerweise dazu.
CajunLuke
1
David: Ich gehe davon aus, dass das, was Apple "Force Quit" nennt, dasselbe ist, egal wie Sie es erreichen, aber ich habe es auch versucht, ohne Wirkung.
Ken

Antworten:

14

Wenn Sie den Namen der App kennen, können Sie im Aktivitätsmonitor überprüfen, ob sie dort noch ausgeführt wird, und versuchen, sie zu beenden. Wenn dies nicht funktioniert, notieren Sie sich die Prozess-ID (pid) der App. Gehen Sie zum Terminal und geben Sie ein kill [pid]und ersetzen Sie "[pid]" durch die Nummer, die Sie zuvor notiert haben. Wenn das nicht funktioniert, versuchen Sie es kill -3 [pid]und wenn das nicht funktioniert kill -9 [pid]. Wenn der Prozess von einem anderen Benutzer gehört (dies ist wahrscheinlich nicht), müssen Sie ersetzen killmit sudo killund Ihr Kennwort eingeben , wenn Sie dazu aufgefordert.

Wenn die App nicht im Aktivitätsmonitor angezeigt wird oder nicht killangezeigt werden konnte, kann es sein, dass das Fenster an einem anderen Ort hängen bleibt und die App einfach nicht mehr ausgeführt wird. In diesem Fall kann es manchmal (nicht immer) funktionieren killall SystemUIServeroder killall Dock.

Wenn dies nicht funktioniert, müssen Sie sich abmelden und wieder anmelden oder einen Neustart durchführen. Die wenigen Male, die ich bis zu diesem Punkt gekommen bin, war die App so blockiert, dass das Abmelden oder Herunterfahren verhindert wurde, sodass ich einen harten Neustart durchführen musste.

CajunLuke
quelle
Ich habe all das ausprobiert ( sudoauch wenn der Prozess mir gehört), ohne dass sich etwas geändert hat. Werden killall SystemUIServeralle meine anderen offenen Anwendungen beeinflussen, wie Fensterpositionen zu vergessen?
Ken
2
gentmatt: Entsprechend kill -list -3 SIGQUIT und -9 ist SIGKILL ("nicht fangbarer, nicht ignorierbarer Kill").
Ken
1
@gentmatt 3 ist das QUIT-Signal, mit dem der Prozess das Signal abfangen und die Bereinigung durchführen kann. 9 is KILL ist "nicht fangbar und nicht ignorierbar". Es gibt eine Menge anderer Signale, die Sie senden können. Führen Sie man killden Befehl run aus (der zu den zehn besten UNIX-Befehlen aller Zeiten gehört), um alle Befehle anzuzeigen.
CajunLuke
1
Normalerweise töte ich nur -9. -3 ist nicht stärker als "Force Quit"
segfault
3
@BoTian True; Ich gehe direkt zu -9. Manchmal kümmere ich mich überhaupt nicht um Force Quit. Aber für einen Benutzer, der nicht weiß, was er tut, könnte dies funktionieren und ist weniger schädlich. Es dauert auch nicht sehr lange, so dass die Zeit, die zum erwarteten Ergebnisverhältnis aufgewendet wird, nicht allzu schlecht ist.
CajunLuke
7

Das Force-Quit-Fenster killallund killalle Sendeprozesse verarbeiten standardmäßig TERM-Signale. Sie können verwenden, killall -killwenn das nicht funktioniert.

Das Dienstprogramm killall bricht Prozesse ab, die nach Namen ausgewählt wurden, und nicht die Auswahl nach pid, die mit kill (1) durchgeführt wurde. Standardmäßig sendet es ein TERM-Signal an alle Prozesse mit einer echten UID, die mit dem Aufrufer von killall identisch ist und mit dem Namen procname übereinstimmt. Der Superuser darf jeden Prozess beenden.

Wenn Sie sudo dtrace -n 'proc:::signal-send /pid/ { printf("%s -%d %d",execname,args[2],args[1]->pr_pid); }'eine Anwendung über das Force-Quit-Fenster ausführen und beenden, wird das Signal normalerweise als -15 (TERM) angezeigt. Wenn Sie jedoch einen Hintergrundprozess (oder eine Anwendung, die nicht im Dock angezeigt wird) über Activity Monitor beenden, wird das Signal normalerweise als -9 (KILL) angezeigt.

SIGTERM ist das Standardsignal, das von den Befehlen kill oder killall an einen Prozess gesendet wird. Es bewirkt die Beendigung eines Prozesses, kann jedoch im Gegensatz zum SIGKILL-Signal vom Prozess abgefangen und interpretiert (oder ignoriert) werden. Daher ist SIGTERM mit der Aufforderung vergleichbar, einen Prozess ordnungsgemäß zu beenden, um die Bereinigung und das Schließen von Dateien zu ermöglichen. Aus diesem Grund gibt init auf vielen Unix-Systemen während des Herunterfahrens SIGTERM an alle Prozesse aus, die für das Ausschalten nicht erforderlich sind, wartet einige Sekunden und gibt dann SIGKILL aus, um alle verbleibenden Prozesse gewaltsam zu beenden.

Lri
quelle
Einige gute Informationen hier, aber keine dieser Varianten, um den Prozess zu beenden, scheint überhaupt eine Auswirkung darauf zu haben.
Ken
Wenn es nicht SIGKILLfunktioniert, befindet sich die App wahrscheinlich im unterbrechungsfreien Schlaf , und Sie können wirklich nichts tun (außer einen Neustart durchzuführen).
Blacklight Shining
Ich frage mich auch, ob es sich um eine Benutzer-App wie mail.app oder pages.app handelt oder ob es sich um einen Systemprozess wie Spotlight oder einen App-Hintergrundprozess wie Plex handelt (den ich nur schwer entfernen kann).
David DelMonte
6

Ich hatte Situationen, in denen Force Quit, Activity Monitor killund andere Methoden nicht funktionierten und mein Mac sich deshalb nicht herunterfahren ließ.

In diesem Fall sudo shutdown -r nowfunktioniert ein, wenn nichts anderes wäre, und ist wahrscheinlich besser als ein hartes Herunterfahren über den Netzschalter.

Das Karate Kid
quelle
1

Wie in den obigen Antworten ist der stärkste Weg, einen Prozess zu beenden SIGKILL, z kill -9 process_id.

Es existieren jedoch Prozesse, die schlicht unmöglich sind Force Quitnoch kill. Sie riefen als zombieProzesse.

Hier ist ein kurzes Skript, das einen zombieProzess für zwei Minuten erstellt:

perl -e 'if($p=fork) {print "unkillable pid:$p\n" ;system("ps -l"); sleep(120)}'

Führen Sie das obige Skript im Terminal aus und Sie erhalten die Ausgabe wie folgt:

     unkillable pid:50571
        UID   PID  PPID        F CPU PRI NI       SZ    RSS WCHAN     S             ADDR TTY           TIME CMD
        501 47380 47379     4006   0  31  0  2448416   2900 -      S                   0 ttys000    0:00.36 -bash
        501 50570 47380     4006   0  31  0  2443512   1424 -      S+                  0 ttys000    0:00.01 perl -e if($p=fork) {print "u
#THIS-> 501 50571 50570     2006   0   0  0        0      0 -      Z+                  0 ttys000    0:00.00 (perl)
        501 12795 12794     4006   0  31  0  2448296   1752 -      S+                  0 ttys001    0:00.75 -bash
        501 50123 50122     4006   0  31  0  2448296   2688 -      S+                  0 ttys002    0:00.14 -bash

Wenn Sie die Statusspalte für den unkillable-Prozess (in diesem Fall: 50571) überprüfen, sehen Sie das ZFlag, was bedeutet zombie.

Sie können versuchen, ein beliebiges killSignal zu senden (z. B. kill -9 50571), und der Vorgang bleibt bestehen. Wie auch immer, es tut Ihrem System nicht viel weh, weil es tatsächlich nicht existiert - es belegt nur die Prozesstabelle.

Im obigen Beispiel wird es in 120 Sekunden gelöscht.

jm666
quelle
0

Das solltest du tun:

  1. Doppelklicken Sie im Aktivitätsmonitor auf den Prozess ODER klicken Sie auf das Symbol Info, um das Fenster des Prozesses zu öffnen.
  2. Sie sehen die Prozessnummer in der Prozessgruppenzeile als processName (####), wobei "####" die Nummer Ihres Prozesses ist.
  3. Öffnen Sie das Terminal, geben Sie "sudo kill ####" ohne Anführungszeichen ein und drücken Sie die Eingabetaste
  4. Geben Sie Ihr Passwort ein, das Terminal zeigt Ihre Eingabe hier nicht an
  5. Prozess wird getötet.

Ein solcher Prozess wird am besten im abgesicherten Modus entfernt, wenn Sie versuchen, eine Deinstallation durchzuführen.

Prost, Bryan

Brock Vond
quelle