Come uccidere tutte le finestre aperte?


9

Voglio chiudere tutte le finestre che appaiono sul mio desktop. Ho pensato di farlo pkill, ma sono riuscito a ucciderli solo uno alla volta, il che non è quello che voglio. L'obiettivo finale è quello di metterlo in uno script per eseguire un chiosco, rileverà se il software del chiosco è in esecuzione (ho capito questa parte) e se non lo è, allora ucciderà tutte le finestre aperte e riavvia il mio software per chioschi.


che ne dici di riavviare gdm o kdm
— Raza il

Risposte:


3

L'approccio più semplice utilizza xdotool:

xdotool search "" windowkill %@

xdotool search ""elenca ogni finestra. windowkill %@uccide ognuno di loro; %@si riferisce a tutti i risultati della ricerca precedente.

È possibile preferire utilizzare l' --maxdepth 1opzione per searchlimitare le finestre selezionate alle finestre di livello superiore.


Purtroppo, non funziona quando si utilizza VNC (xdotool genera un errore di segmentazione).
— Diego Queiroz,

Vale probabilmente un'altra domanda: le cose dovrebbero essere le stesse sotto VNC o no.
— Michael Homer,

Sono d'accordo, ma non lo è. C'è una segnalazione di bug su questo problema: github.com/jordansissel/xdotool/issues/126
— Diego Queiroz

2

funziona almeno per kde e xfce (gnome non testato, ma potrebbe funzionare anche):

1) installa wmctrl

2) quindi creare uno script chiamato close_windows.sh:

# close all open windows gracefully without closing the Desktop environment
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 (you probably don't need this section)
while test $WIN_IDs; do 
    sleep 0.1; 
    WIN_IDs=$(wmctrl -l | grep -vwE "Desktop$|xfce4-panel$" | cut -f1 -d' ')
done 

3) renderlo eseguibile:chmod +x ./close_windows.sh

3) creare una voce nel menu di avvio che punta allo script close_windows.

4) eseguire lo script close_windows da questa voce.

fonte: https://forum.manjaro.org/index.php?topic=4412.0 :


Soluzione perfetta E funziona anche con VNC. È importante aggiungere che potrebbe essere necessario modificare "Desktop $" in modo che corrisponda alla localizzazione dell'installazione (ad es. In portoghese è "Área de trabalho $").
— Diego Queiroz,

2

Michael Homer e Guido van Steen hanno mostrato modi per uccidere tutte le finestre. Questo non ucciderebbe i processi in background, se ce ne fossero. Non ucciderebbe i programmi bloccati la cui finestra è andata ma che sono ancora in esecuzione senza un'interfaccia utente. Quindi potresti preferire di uccidere i processi invece.

È possibile eseguire kill -9 -1come utente non root per terminare tutti i processi in esecuzione come tale utente. Dovresti eseguire l'applicazione kiosk come utente dedicato (che è comunque una configurazione standard per i chioschi, per motivi di sicurezza) e assicurarti che l'interfaccia del chiosco si riavvii quando tutti i processi nella sessione sono morti (che è anche una configurazione standard per i chioschi, per robustezza).


0

La risposta di Guido funziona perfettamente per me. Ho scritto un piccolo prog Pascal cross-compilabile Linux / Windows compilato con Lazarus / FPC per uso personale, che avvia il suo comando wmctrl o l'equivalente comando windows Powershell:

program CloseAll;
{Ferme toutes les fenêtres}
{$mode objfpc}{$H+}
uses
    Classes, SysUtils, Process, Crt;

var
  p: TProcess;
 // i: integer=0;
  {$R *.res}
begin
      p := TProcess.Create(nil);
    try
        p.ShowWindow := swoHIDE; // Cache la console
        {$ifdef windows}
        p.Executable := 'cmd.exe';
        p.Parameters.Add('powershell -command "(New-Object -comObject Shell.Application).Windows() | foreach-object {$_.quit()}; Get-Process | Where-Object {$_.MainWindowTitle -ne \"\"} | stop-process"');
        {$else}
        p.Executable := '/bin/bash';
        p.Parameters.Add('-c');
        //close all open windows gracefully without closing the Desktop environment
        p.Parameters.Add ('WIN_IDs=$(wmctrl -l | grep -vwE "Bureau$|xfce4-panel$" | cut -f1 -d' + #39 + ' ' + #39 + ')' +#10 + 'for i in $WIN_IDs; do wmctrl -ic "$i"; done');
        //p.Options := p.Options + [poWaitOnExit, poUsePipes];
        {$endif}
        p.Execute;
    finally
        p.Free
    end
end.

Ho anche notato che Diego ha ragione sul nome del desktop e il mio eseguibile Linux funzionerebbe solo su un ambiente francese xfce con il desktop chiamato "Bureau". Non sono riuscito a trovare il nome del desktop nelle variabili di ambiente (e non ne valeva la pena).

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.