¿Cómo matar todas las ventanas abiertas?

9

Quiero cerrar todas las ventanas que aparecen en mi escritorio. He pensado en hacerlo pkill, pero solo pude matarlos uno a la vez, que no es lo que quiero. El objetivo final es poner esto en una secuencia de comandos para ejecutar un quiosco, detectará si el software del quiosco se está ejecutando (descubrí esta parte) y si no es así, matará cualquier ventana que esté abierta y reiniciará mi software de quiosco.

Joe
fuente
¿Qué tal reiniciar gdm o kdm?
Raza

Respuestas:

3

El enfoque más simple utiliza xdotool:

xdotool search "" windowkill %@

xdotool search ""enumera todas las ventanas. windowkill %@mata a cada uno de ellos; %@se refiere a todos los resultados de la búsqueda anterior.

Es posible que prefiera utilizar la --maxdepth 1opción para searchlimitar las ventanas seleccionadas a las ventanas de nivel superior.

Michael Homer
fuente
Lamentablemente, no funciona cuando se usa VNC (xdotool genera una falla de segmentación).
Diego Queiroz
Probablemente valga la pena otra pregunta: las cosas deberían ser iguales bajo VNC o no.
Michael Homer
Estoy de acuerdo, pero no lo es. Hay un informe de error sobre este problema: github.com/jordansissel/xdotool/issues/126
Diego Queiroz
2

esto funciona al menos para kde y xfce (gnome no probado, pero podría funcionar también):

1) instalar wmctrl

2) luego crea un script llamado 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) hazlo ejecutable:chmod +x ./close_windows.sh

3) cree una entrada en el menú de inicio que apunte al script close_windows.

4) ejecute el script close_windows desde esta entrada.

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

Guido van Steen
fuente
Solución perfecta. Y también funciona con VNC. Es importante agregar que es posible que deba cambiar "Desktop $" para que coincida con la localización de su instalación (por ejemplo, en portugués es "Área de trabalho $").
Diego Queiroz
2

Michael Homer y Guido van Steen han mostrado formas de matar todas las ventanas. Esto no mataría los procesos en segundo plano, si hay alguno. No mataría a los programas bloqueados cuya ventana se ha ido, pero que todavía se están ejecutando sin una interfaz de usuario. Por lo tanto, puede preferir matar los procesos en su lugar.

Puede ejecutarse kill -9 -1como usuario no root para eliminar todos los procesos que se ejecutan como ese usuario. Debería ejecutar la aplicación de kiosco como un usuario dedicado (de todos modos, esa es una configuración estándar para los kioscos, por seguridad) y para asegurarse de que la interfaz del kiosco se reinicie cuando todos los procesos de la sesión estén inactivos (que también es una configuración estándar para los kioscos, para robustez).

Gilles 'SO- deja de ser malvado'
fuente
0

La respuesta de Guido funciona perfectamente para mí. Escribí un pequeño programa Pascal de compilación cruzada de Linux / Windows compilado con Lazarus / FPC para mi propio uso, que lanza su comando wmctrl, o el comando equivalente de 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.

También noté que Diego tiene razón sobre el nombre del escritorio, y mi ejecutable de Linux solo funcionaría en un entorno francés xfce con el escritorio llamado "Bureau". No pude encontrar el nombre del escritorio en las variables de entorno (y no valió la pena).

Francois_C
fuente