C'è qualcosa di più strong di "Force Quit"?

24

Ho un'app che non morirà: è andata via dal dock, ma la finestra rimane (con un beachball, se lo topo sopra). Sta usando nessuna CPU, ma voglio che vada via.

C'è qualcosa di più strong di "Force Quit", per davvero davvero uccidere un'app?

    
posta Ken 20.09.2012 - 21:24
fonte

5 risposte

14

Se conosci il nome dell'app, puoi controllare in Activity Monitor per vedere se è ancora in esecuzione e provare la sua uscita forzata. Se ciò non funziona, prendi nota dell'ID di processo dell'app (pid). Vai al Terminale e digita kill [pid] , sostituendo "[pid]" con il numero che hai annotato in precedenza. Se ciò non funziona, prova kill -3 [pid] e se questo non funziona kill -9 [pid] . Se il processo è di proprietà di un utente diverso (non è probabile), potrebbe essere necessario sostituire kill con sudo kill e digitare la password quando richiesto.

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

Se non funziona, dovrai disconnetterti e tornare indietro o riavviare. Le poche volte che sono arrivato a questo punto, l'app era così bloccata da impedire la disconnessione o lo spegnimento, quindi ho dovuto riavviare molto.

    
risposta data 20.09.2012 - 21:34
fonte
7

La finestra di chiusura forzata, killall e kill inviano tutti i segnali TERM dei processi per impostazione predefinita. Puoi utilizzare killall -kill se non funziona.

The killall utility kills processes selected by name, as opposed to the selection by pid as done by kill(1). By default, it will send a TERM signal to all processes with a real UID identical to the caller of killall that match the name procname. The super-user is allowed to kill any process.

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

SIGTERM is the default signal sent to a process by the kill or killall commands. It causes the termination of a process, but unlike the SIGKILL signal, it can be caught and interpreted (or ignored) by the process. Therefore, SIGTERM is akin to asking a process to terminate nicely, allowing cleanup and closure of files. For this reason, on many Unix systems during shutdown, init issues SIGTERM to all processes that are not essential to powering off, waits a few seconds, and then issues SIGKILL to forcibly terminate any such processes that remain.

    
risposta data 21.09.2012 - 10:29
fonte
6

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 spegnerlo a causa di ciò.

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

    
risposta data 10.09.2015 - 17:04
fonte
1

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

Tuttavia, esistono processi che sono semplicemente impossibili per Force Quit o kill . Hanno chiamato come zombie processi.

Ecco uno script breve che creerà un processo zombie 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 di stato per il processo non registrabile (in questo caso: 50571) vedi il flag Z , che cosa significa zombie .

Puoi provare a inviare qualsiasi segnale kill (ad esempio kill -9 50571 ) e il processo continuerà a esistere. Ad ogni modo, non danneggia molto il tuo sistema, perché in realtà non esiste, occupa solo la tabella dei processi.

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

    
risposta data 02.08.2014 - 10:29
fonte
0

Questo è quello che dovresti fare:

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

Un processo come questo è meglio rimosso in modalità provvisoria se hai intenzione di tentare una disinstallazione.

Saluti, Bryan

    
risposta data 21.03.2016 - 07:34
fonte

Leggi altre domande sui tag