Wie töte ich alle offenen Fenster?

9

Ich möchte alle Fenster schließen, die auf meinem Desktop angezeigt werden. Ich habe darüber nachgedacht pkill, aber ich konnte es nur schaffen, sie einzeln zu töten, was ich nicht will. Das Endziel besteht darin, dies in ein Skript zum Ausführen eines Kiosks einzufügen. Es erkennt, ob die Kiosksoftware ausgeführt wird (ich habe diesen Teil herausgefunden). Wenn dies nicht der Fall ist, werden alle geöffneten Fenster getötet und mein System neu gestartet Kiosksoftware.

Joe
quelle
wie wäre es mit einem Neustart von gdm oder kdm
Raza

Antworten:

3

Der einfachste Ansatz verwendet xdotool:

xdotool search "" windowkill %@

xdotool search ""listet jedes Fenster auf. windowkill %@tötet jeden von ihnen; %@bezieht sich auf alle Ergebnisse der vorherigen Suche.

Sie können es vorziehen , die verwenden --maxdepth 1Option , um searchdie Fenster zu Fenster der obersten Ebene ausgewählt zu begrenzen.

Michael Homer
quelle
Leider funktioniert es bei Verwendung von VNC nicht (xdotool löst einen Segmentierungsfehler aus).
Diego Queiroz
Das ist wahrscheinlich eine weitere Frage wert - unter VNC sollten die Dinge gleich sein oder nicht.
Michael Homer
Ich stimme zu, aber es ist nicht. Es gibt einen Fehlerbericht zu diesem Problem: github.com/jordansissel/xdotool/issues/126
Diego Queiroz
2

Dies funktioniert zumindest für kde und xfce (Gnom nicht getestet, aber es könnte auch funktionieren):

1) installiere wmctrl

2) Erstellen Sie dann ein Skript mit dem Namen 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) mach es ausführbar:chmod +x ./close_windows.sh

3) Erstellen Sie im Startmenü einen Eintrag, der auf das Skript close_windows verweist.

4) Führen Sie das Skript close_windows aus diesem Eintrag aus.

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

Guido van Steen
quelle
Perfekte Lösung. Und es funktioniert auch mit VNC. Es ist wichtig hinzuzufügen, dass Sie möglicherweise "Desktop $" ändern müssen, um es Ihrer Installationslokalisierung anzupassen (z. B. auf Portugiesisch "Área de trabalho $").
Diego Queiroz
2

Michael Homer und Guido van Steen haben Wege aufgezeigt, alle Fenster zu töten. Dies würde Hintergrundprozesse nicht beenden, wenn es welche gibt. Es würde nicht abgestürzte Programme töten, deren Fenster verschwunden ist, die aber immer noch ohne Benutzeroberfläche ausgeführt werden. Sie können es also vorziehen, die Prozesse stattdessen abzubrechen.

Sie können kill -9 -1als Nicht-Root-Benutzer ausgeführt werden, um alle Prozesse zu beenden, die als dieser Benutzer ausgeführt werden. Sie müssten die Kiosk-Anwendung als dedizierter Benutzer ausführen (dies ist aus Sicherheitsgründen ohnehin eine Standardkonfiguration für Kioske) und sicherstellen, dass die Kiosk-Schnittstelle neu gestartet wird, wenn alle Prozesse in der Sitzung beendet sind (dies ist auch eine Standardkonfiguration für Kioske). für Robustheit).

Gilles 'SO - hör auf böse zu sein'
quelle
0

Guidos Antwort funktioniert perfekt für mich. Ich habe einen kleinen Linux / Windows-Cross-Compilable-Pascal-Prog geschrieben, der mit Lazarus / FPC für meinen eigenen Gebrauch kompiliert wurde und seinen Befehl wmctrl oder den entsprechenden Powershell-Windows-Befehl startet:

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.

Mir ist auch aufgefallen, dass Diego mit dem Desktop-Namen Recht hat und meine ausführbare Linux-Datei nur in einer französischen xfce-Umgebung mit dem Desktop "Bureau" funktioniert. Ich konnte den Desktop-Namen in den Umgebungsvariablen nicht finden (und die Mühe hat sich nicht gelohnt).

Francois_C
quelle