Como matar todas as janelas abertas?

9

Quero fechar todas as janelas que aparecem na minha área de trabalho. Eu pensei em fazer isso pkill, mas só consegui matá-los um de cada vez, o que não é o que eu quero. O objetivo final é colocar isso em um script para executar um quiosque, ele detectará se o software do quiosque está em execução (eu percebi essa parte) e, se não estiver, ele matará todas as janelas abertas e reiniciará o meu quiosque. software de quiosque.

Joe
fonte
que tal reiniciar o gdm ou o kdm
Raza

Respostas:

3

A abordagem mais simples usa xdotool:

xdotool search "" windowkill %@

xdotool search ""lista todas as janelas. windowkill %@mata cada um deles; %@refere-se a todos os resultados da pesquisa anterior.

Você pode preferir usar a --maxdepth 1opção para searchlimitar as janelas selecionadas para as de nível superior.

Michael Homer
fonte
Infelizmente, ele não funciona ao usar o VNC (o xdotool gera uma falha de segmentação).
Diego Queiroz
Provavelmente isso vale outra pergunta - as coisas devem ser as mesmas no VNC ou não.
Michael Homer
Eu concordo, mas não é. Existe um relatório de bug sobre esse problema: github.com/jordansissel/xdotool/issues/126 #
Diego Queiroz
2

isso funciona pelo menos para o kde e o xfce (o gnome não foi testado, mas pode funcionar também):

1) instalar o wmctrl

2) crie um script chamado 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) torná-lo executável:chmod +x ./close_windows.sh

3) crie uma entrada no menu Iniciar que aponte para o script close_windows.

4) execute o script close_windows a partir desta entrada.

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

Guido van Steen
fonte
Solução perfeita. E também funciona com VNC. Importante acrescentar que você pode precisar alterar "Desktop $" para corresponder à sua localização de instalação (por exemplo, em português, é "Área de trabalho $").
Diego Queiroz
2

Michael Homer e Guido van Steen mostraram maneiras de matar todas as janelas. Isso não mataria os processos em segundo plano, se houver algum. Não mataria programas travados cuja janela se foi, mas que ainda estão sendo executados sem uma interface de usuário. Então você pode preferir matar os processos.

Você pode executar kill -9 -1como um usuário não raiz para eliminar todos os processos em execução como esse usuário. Você precisaria executar o aplicativo de quiosque como um usuário dedicado (que é uma configuração padrão para quiosques de qualquer maneira, para segurança) e garantir que a interface do quiosque seja reiniciada quando todos os processos da sessão estiverem mortos (que também é uma configuração padrão para quiosques, robustez).

Gilles 'SO- parar de ser mau'
fonte
0

A resposta de Guido funciona perfeitamente para mim. Eu escrevi um pequeno programa Pascal compilável em Linux / Windows compilado com o Lazarus / FPC para meu próprio uso, que lança seu comando wmctrl ou o comando equivalente do 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.

Também notei que Diego está certo sobre o nome da área de trabalho, e meu executável Linux funcionaria apenas em um ambiente francês xfce com a área de trabalho chamada "Bureau". Não consegui encontrar o nome da área de trabalho nas variáveis ​​de ambiente (e não valeu a pena).

Francois_C
fonte