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?
SIGTERM
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?
SIGTERM
Risposte:
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 kill
con sudo kill
e 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 SystemUIServer
o 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.
sudo
, anche se il processo è di mia proprietà), senza alcuna modifica. Interesserà killall SystemUIServer
qualsiasi altra mia app aperta, come dimenticare le posizioni delle finestre?
kill -l
-3 è SIGQUIT e -9 è SIGKILL ("uccisione non catturabile, non ignorabile").
man kill
(che è tra i primi 10 migliori comandi UNIX di sempre) per vederli tutti.
La finestra di chiusura forzata killall
e kill
tutti i processi di invio vengono elaborati per impostazione predefinita. Puoi usarlo killall -kill
se 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.
SIGKILL
funziona nemmeno , l'app è probabilmente in modalità di sospensione ininterrotta e non c'è davvero nulla che puoi fare (a meno del riavvio).
Ho avuto situazioni in cui Force Quit, Activity Monitor kill
e 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 now
funzionato quando nient'altro avrebbe funzionato, ed è probabilmente meglio che fare un arresto forzato tramite il pulsante di accensione.
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 Quit
né kill
. Hanno chiamato come zombie
processi.
Ecco un breve script che creerà un zombie
processo 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 Z
bandiera, che significa zombie
.
Puoi provare a inviare qualsiasi kill
segnale (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.
Questo è ciò che dovresti fare:
È consigliabile rimuovere un processo come questo in modalità provvisoria se si tenta di disinstallare.
Saluti, Bryan