C'è qualcosa di più forte di "Uscita forzata"?


24

Ho un'app che non morirà: è sparita dal dock, ma la finestra rimane (con un pallone da spiaggia, se ci passo sopra). Non utilizza CPU, ma voglio che vada via.

Esiste qualcosa di più forte di "Uscita forzata" per uccidere davvero un'app?


Non sono sicuro che sia più forte, ma prova App> Utilità> Monitoraggio attività. Trova il processo e Forza Esci. Se il problema persiste, annota il numero di processo, vai su Terminale e digita "kill #" dove # è il numero di processo. HTH
David DelMonte,

6
il pulsante di accensione?
Daniel

1
@DanielLawson Sfortunatamente, queste situazioni di solito portano a questo.
CajunLuke,

1
David: Presumo che ciò che Apple chiama "Uscita forzata" sia lo stesso, non importa come ci arrivi, ma ci ho provato anche io, senza alcun effetto.
Ken,

Risposte:


14

Se conosci il nome dell'app, puoi controllare Activity Monitor per vedere se è ancora in esecuzione lì e provare a forzare l'uscita. Se il problema persiste, prendere nota dell'ID processo (pid) dell'app. Vai al Terminale e digita kill [pid], sostituendo "[pid]" con il numero annotato in precedenza. Se non funziona, prova kill -3 [pid]e se non funziona kill -9 [pid]. Se il processo è di proprietà di un altro utente (ciò non è probabile), potrebbe essere necessario sostituirlo killcon sudo kille digitare la password quando richiesto.

Se l'app non viene visualizzata in Activity Monitor o non killè possibile, la finestra potrebbe essere rimasta bloccata da qualche altra parte e l'app semplicemente non è più in esecuzione. In questo caso, a volte (non sempre) può funzionare su killall SystemUIServero killall Dock.

Se nessuna di queste funzioni, è necessario disconnettersi e riconnettersi o riavviare. Le poche volte che sono arrivato a questo punto, l'app era così bloccata da impedire la disconnessione o l'arresto, quindi ho dovuto riavviare il sistema.


Ho provato tutti questi (incluso sudo, anche se il processo è di mia proprietà), senza alcuna modifica. Interesserà killall SystemUIServerqualsiasi altra mia app aperta, come dimenticare le posizioni delle finestre?
Ken,

2
gentmatt: Secondo kill -l-3 è SIGQUIT e -9 è SIGKILL ("uccisione non catturabile, non ignorabile").
Ken,

1
@gentmatt 3 è il segnale QUIT che dà al processo la possibilità di intercettare il segnale ed eseguire la pulizia. 9 is KILL è "non catchable e non ignorabile". Ci sono molti altri segnali che puoi inviare; esegui man kill(che è tra i primi 10 migliori comandi UNIX di sempre) per vederli tutti.
CajunLuke,

1
Di solito uccido solo -9. -3 non è più forte di "Uscita forzata"
segfault

3
@BoTian True; Salto direttamente a -9. A volte non mi preoccupo affatto di Force Quit. Ma per un utente che non sa cosa sta facendo, potrebbe funzionare ed è meno probabile che sia dannoso. Inoltre, non ci vuole molto tempo, quindi il tempo speso per il rapporto di risultato atteso non è poi così male.
CajunLuke,

7

La finestra di chiusura forzata killalle killtutti i processi di invio vengono elaborati per impostazione predefinita. Puoi usarlo killall -killse non funziona.

L'utilità killall uccide i processi selezionati per nome, al contrario della selezione per pid effettuata da kill (1). Per impostazione predefinita, invierà un segnale TERM a tutti i processi con un UID reale identico al chiamante di killall che corrisponde al nome procname. Al superutente è consentito interrompere qualsiasi processo.

Se si esegue sudo dtrace -n 'proc:::signal-send /pid/ { printf("%s -%d %d",execname,args[2],args[1]->pr_pid); }'e si chiude un'applicazione dalla finestra di chiusura forzata, il segnale viene generalmente visualizzato come -15 (TERM). Ma quando si esce da un processo in background (o un'applicazione che non è mostrata nel Dock) da Activity Monitor, il segnale viene solitamente mostrato come -9 (KILL).

SIGTERM è il segnale predefinito inviato a un processo dai comandi kill o killall. Causa la fine di un processo, ma a differenza del segnale SIGKILL, può essere catturato e interpretato (o ignorato) dal processo. Pertanto, SIGTERM è simile a chiedere a un processo di terminare correttamente, consentendo la pulizia e la chiusura dei file. Per questo motivo, su molti sistemi Unix durante l'arresto, init invia SIGTERM a tutti i processi che non sono essenziali per lo spegnimento, attende alcuni secondi e quindi emette SIGKILL per terminare forzatamente tutti i processi che rimangono.


Alcune buone informazioni qui, ma nessuna di queste varianti dell'uccisione del processo sembra avere alcun effetto su di esso.
Ken,

Se non SIGKILLfunziona nemmeno , l'app è probabilmente in modalità di sospensione ininterrotta e non c'è davvero nulla che puoi fare (a meno del riavvio).
Blacklight Shining

Mi chiedo anche se questa fosse un'app utente, come mail.app o pages.app o se fosse in qualche modo, un processo di sistema, come Spotlight, o un processo in background dell'app, come Plex (che ho difficoltà a rimuovere).
David DelMonte,

6

Ho avuto situazioni in cui Force Quit, Activity Monitor kille altri metodi non hanno funzionato e il mio Mac non è stato in grado di spegnersi a causa di ciò.

In questo caso, ha sudo shutdown -r nowfunzionato quando nient'altro avrebbe funzionato, ed è probabilmente meglio che fare un arresto forzato tramite il pulsante di accensione.


1

Come nelle risposte precedenti, il modo più efficace per terminare qualsiasi processo è SIGKILL, ad es kill -9 process_id.

Tuttavia, esistono processi quali sono semplicemente impossibile Force Quitkill. Hanno chiamato come zombieprocessi.

Ecco un breve script che creerà un zombieprocesso per due minuti:

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

Esegui lo script sopra nel Terminale e otterrai l'output, come il prossimo:

     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

Se controlli la colonna dello stato per il processo non verificabile (in questo caso: 50571) vedi la Zbandiera, che significa zombie.

Puoi provare a inviare qualsiasi killsegnale (ad es. kill -9 50571) E il processo esiste ancora. Comunque, non fa molto male al tuo sistema, perché in realtà non esiste - occupa solo la tabella dei processi.

Nell'esempio sopra, tra 120 secondi verrà cancellato.


0

Questo è ciò che dovresti fare:

  1. In Activity Monitor, fai doppio clic sul processo OPPURE Fai clic sull'icona Informazioni per aprire la finestra del processo.
  2. Vedrai il processo # nella riga Gruppo di processi come nome processo (####) dove "####" è il numero del tuo processo.
  3. Apri il terminale e digita "sudo kill ####" senza le virgolette e premi invio
  4. Inserisci la tua password, il terminale non mostrerà i tuoi input qui
  5. Il processo viene interrotto.

È consigliabile rimuovere un processo come questo in modalità provvisoria se si tenta di disinstallare.

Saluti, Bryan

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.