Ubuntu non sta inviando SIGTERM allo spegnimento


21

Sto cominciando a sospettare che Ubuntu non stia dicendo alle applicazioni in esecuzione che si sta chiudendo per lasciarle uscire correttamente, ma invece le costringe a smettere.

Se lascio Chrome aperto quando si spegne, dice che non si è chiuso correttamente l'ultima volta quando lo riaprio dopo l'avvio, LibreOffice non mi chiede se voglio salvare il mio documento e sto creando un'applicazione che deve eseguire del codice all'uscita ma non è consentito farlo allo spegnimento del computer.

Come ho capito, SIGTERM viene prima inviato a tutti i processi per consentire loro di uscire in modo pulito e se non escono SIGKILL viene inviato per costringerli ad uscire. Sembra che Ubuntu non stia inviando SIGTERM o non conceda alle applicazioni abbastanza tempo prima di inviare SIGKILL.

C'è un modo per risolvere questo problema?

Sto eseguendo Ubuntu 16.04 ma il problema esisteva anche nel 15.10. Non so dire se fosse già lì da quando ho iniziato a usare Ubuntu quando la 15.10 era la versione più recente.

Modifica: utilizzo Unity e spengo il mio computer premendo l'ingranaggio nell'angolo in alto a destra e selezionando Spegni, anche se il problema è lo stesso se in esecuzione sudo haltnel terminale.

Modifica: osservo lo stesso comportamento solo quando esco. La mia ipotesi è che il segnale dovrebbe essere inviato all'uscita e quindi il problema si presenta all'arresto e alla disconnessione.


Come stai chiudendo?
terdon,

1
Chromium e LibreOffice non gestiscono SIGTERM nel modo in cui vorresti che fosse gestito
Andrea Corbellini,

2
Non sono sicuro di capire cosa intendi. Vuoi dire che non stanno gestendo correttamente SIGTERM? Forse no, ma come ho scritto nella mia domanda, sto lavorando a un programma che gestisce SIGTERM ma quel codice non sembra mai essere eseguito. SIGINT mentre si preme ctrl + C funziona perfettamente. Credo ancora che ci sia qualche problema riguardante Ubuntu che notifica i processi in esecuzione allo spegnimento.
GKraft,


2
È fastidioso dover chiudere manualmente tutte le applicazioni, e se ne dimentichi una ridotta a icona? Non salverà il tuo lavoro. E ci sono molti processi in background che non puoi controllare facilmente o a cui non pensi. Non avranno la possibilità di ripulire dopo se stessi o salvare qualunque cosa stessero facendo.
GKraft,

Risposte:


3

Sfortunatamente, non funziona in questo modo. Molti di quei programmi che in realtà hanno un gestore di segnale, non bloccano il segnale per mostrare una finestra di conferma. La gestione del segnale è spesso minima o mancante.

Puoi facilmente provarlo senza dover chiudere. Invia SIGTERM al tuo processo Firefox o LibreOffice in esecuzione:

$ pkill firefox

Normalmente, Firefox potrebbe chiederti se vuoi davvero chiuderlo. Inoltre, di solito ci vuole un po 'per chiudere, specialmente quando è in esecuzione da molto tempo e usa più di 1 GB di RAM - spesso ci vuole un minuto per terminare il processo dopo che l'ultima finestra è stata chiusa. Nulla di tutto ciò accade quando si invia SIGTERM, il processo si interrompe immediatamente.

Tuttavia, alcuni ambienti desktop chiudono tutte le finestre aperte prima di spegnersi. A differenza di SIGTERM, chiudere una finestra a livello di codice è come fare clic sul pulsante X di quella finestra o Alt+ F4. Questo è anche ciò che fa lo script nell'altra risposta: usa wmctrl per chiudere con grazia tutte le finestre aperte.

Quando una finestra viene chiusa, il programma non ha fretta e può chiudere tutto all'interno di quella finestra, ad esempio schede aperte, e può anche mostrare una finestra di dialogo se c'è lavoro non salvato. Una volta chiuse tutte le finestre aperte di un'applicazione, il processo di solito termina poco dopo.

Quindi dipende dall'ambiente desktop (supponendo che si usi l'ambiente desktop per l'arresto e non sudo poweroff). Ad esempio, KDE dovrebbe attendere la chiusura delle finestre aperte prima di chiudere, mentre MATE no.

Conclusione: chiudere manualmente tutte le finestre aperte prima di chiudere. Oppure utilizza un ambiente desktop che attende la chiusura di tutte le finestre.


Vedo che il processo di spegnimento e la gestione del segnale non hanno funzionato esattamente come pensavo. Ora capisco come dovrebbe funzionare e perché non ha funzionato come mi aspettavo.
GKraft,

0

Per quello che vale, qualche tempo fa, ho trovato questa procedura sul forum Manjaro:

close_apps () {
WIN_IDs=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
for i in $WIN_IDs; do wmctrl -ic "$i"; done

# Keep checking and waiting until all windows are closed
while [ "$WIN_IDs" != "" ]; do
        sleep 0.1;
        WIN_IDs=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
done

}

Puoi chiamarlo in uno script per chiudere tutte le app aperte prima dell'arresto (o del riavvio).

L'unico problema è che è stato creato per Xfce, quindi ha bisogno di modifiche che Unity DE impone. Un piccolo aiuto da parte di qualcuno più esperto verrebbe bene qui per aiutare a risolvere il problema di OP.


Non avrò accesso al mio computer per un paio di giorni, quindi non posso provarlo anche se è corretto. Dovrebbe davvero essere necessario usare un tale script? Penso che Ubuntu debba gestirlo da solo.
GKraft,

Concordato. Funziona perfettamente in Xubuntu, però. Ad esempio, l'arresto attenderà indefinitamente se è presente un documento non salvato.
SR

0

In realtà, una parte dello script che chiude tutte le finestre e non dipende da alcun DE particolare è disponibile su Ask. Le risposte 2a e 3a sono particolarmente utili. Con solo poche righe in più e creando un programma di avvio nel pannello o sul desktop è possibile ottenere l'arresto regolare che funziona nel DE che si sta utilizzando.

Come chiudere con grazia tutte le finestre aperte


Sembrano promettenti. Probabilmente finirò per usare uno script simile.
GKraft,
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.