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.