Como matar todas as janelas abertas?

8

Eu quero fechar todas as janelas que aparecem na minha área de trabalho. Eu pensei em fazer isso através de pkill , mas eu 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 rodar um quiosque, ele irá detectar se o software do quiosque está rodando (eu descobri essa parte) e se não estiver, ele irá matar todas as janelas que estiverem abertas, e reiniciará o meu software de quiosque.

    
por Joe 21.07.2014 / 19:50

4 respostas

3

A abordagem mais simples usa xdotool :

xdotool search "" windowkill %@

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

Você pode preferir usar a --maxdepth 1 option para search para limitar a janelas selecionadas para janelas de nível superior.

    
por 22.07.2014 / 01:05
2

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

1) instale 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) torne-o executável: chmod +x ./close_windows.sh

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

4) execute o script close_windows desta entrada.

fonte: link :

    
por 21.07.2014 / 21:30
2

Michael Homer e Guido van Steen mostrou maneiras de matar todas as janelas. Isso não mataria os processos em segundo plano, se houver algum. Ele não mataria os programas com falhas cuja janela foi perdida, 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 -1 como 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 para garantir que a interface de quiosque seja reiniciada quando todos os processos da sessão estiverem inativos (que também é uma configuração padrão para quiosques, para robustez).

    
por 22.07.2014 / 01:31
0

A resposta de Guido funciona perfeitamente para mim. Eu escrevi um pequeno programa compilado Pascal do Linux / Windows compilado com o Lazarus / FPC para meu próprio uso, que inicia 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.

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

    
por 12.04.2018 / 11:55