Jak zabić wszystkie otwarte okna?


9

Chcę zamknąć wszystkie okna pojawiające się na pulpicie. Myślałem, aby to zrobić pkill, ale udało mi się zabić ich pojedynczo, co nie jest tym, czego chcę. Ostatecznym celem jest umieszczenie tego w skrypcie, aby uruchomić kiosk, wykryje, czy oprogramowanie kiosku jest uruchomione (wymyśliłem tę część), a jeśli nie, to zabije wszystkie otwarte okna i uruchomi ponownie oprogramowanie kiosku.


co powiesz na ponowne uruchomienie gdm lub kdm
Raza

Odpowiedzi:


3

Najprostsze podejście wykorzystuje xdotool:

xdotool search "" windowkill %@

xdotool search ""wyświetla każde okno. windowkill %@zabija każdego z nich; %@odnosi się do wszystkich wyników poprzedniego wyszukiwania.

Może wolisz skorzystać z --maxdepth 1opcji , aby searchograniczyć do wybranych okien okien najwyższego poziomu.


1
Niestety nie działa przy użyciu VNC (xdotool podnosi błąd segmentacji).
Diego Queiroz

To chyba warte innego pytania - w VNC powinno być tak samo, czy nie.
Michael Homer

Zgadzam się, ale tak nie jest. Istnieje raport o błędzie dotyczący tego problemu: github.com/jordansissel/xdotool/issues/126
Diego Queiroz

2

działa to przynajmniej dla kde i xfce (gnome nie testowany, ale może również działać):

1) zainstaluj wmctrl

2) następnie utwórz skrypt o nazwie 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) uczynić go wykonywalnym:chmod +x ./close_windows.sh

3) Utwórz pozycję w menu Start, która wskazuje na skrypt close_windows.

4) uruchom skrypt close_windows z tego wpisu.

źródło: https://forum.manjaro.org/index.php?topic=4412.0 :


Idealne rozwiązanie. Działa również z VNC. Ważne, aby dodać, że może być konieczna zmiana „Desktop $” w celu dopasowania do lokalizacji instalacji (np. W języku portugalskim jest to „Área de trabalho $”).
Diego Queiroz

2

Michael Homer i Guido van Steen pokazali sposoby na zabicie wszystkich okien. Nie zabiłoby to procesów działających w tle, jeśli takie istnieją. Nie zabiłoby to zawieszonych programów, których okno zniknęło, ale które nadal działają bez interfejsu użytkownika. Dlatego możesz zamiast tego zabić procesy.

Możesz działać kill -9 -1jako użytkownik inny niż root, aby zabić wszystkie procesy uruchomione jako ten użytkownik. Musisz uruchomić aplikację kiosku jako dedykowany użytkownik (i tak jest to standardowa konfiguracja kiosków, dla bezpieczeństwa) i upewnić się, że interfejs kiosku uruchomi się ponownie, gdy wszystkie procesy w sesji będą martwe (co jest również standardową konfiguracją kiosków, za solidność).


0

Odpowiedź Guido doskonale dla mnie działa. Napisałem mały kompilowalny program Pascal dla systemu Linux / Windows skompilowany z Lazarus / FPC na własny użytek, który uruchamia jego polecenie wmctrl lub równoważne polecenie systemu 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.

Zauważyłem również, że Diego ma rację co do nazwy pulpitu, a mój plik wykonywalny Linuksa działałby tylko we francuskim środowisku xfce z pulpitem o nazwie „Bureau”. Nie mogłem znaleźć nazwy pulpitu w zmiennych środowiskowych (i nie było to warte kłopotu).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.