열린 창을 모두 죽이는 방법?


9

데스크탑에 나타나는 모든 창을 닫고 싶습니다. 나는 이것을 통해 생각 pkill했지만, 한 번에 하나씩 만 죽일 수 있었는데, 내가 원하는 것이 아닙니다. 최종 목표는 키오스크를 실행하기 위해 스크립트에 넣는 것입니다. 키오스크 소프트웨어가 실행 중인지 감지하고 (이 부분을 알아 냈습니다) 그렇지 않은 경우 열려있는 모든 창을 종료하고 다시 시작합니다. 키오스크 소프트웨어.


gdm 또는 kdm을 다시 시작하는 방법
Raza

답변:


3

가장 간단한 방법은 xdotool다음을 사용합니다 .

xdotool search "" windowkill %@

xdotool search ""모든 창을 나열합니다. windowkill %@그들 모두를 죽인다. 이전 검색의 모든 결과를 %@나타냅니다 .

당신은 사용하는 것이 좋습니다 --maxdepth 1옵션을 하는 search최상위 창에 선택한 창을 제한 할 수 있습니다.


1
안타깝게도 VNC를 사용할 때는 작동하지 않습니다 (xdotool에서 세그먼트 오류가 발생 함).
Diego Queiroz

그것은 아마도 또 다른 질문의 가치가 있습니다-VNC에서 상황은 동일해야합니다.
마이클 호머

동의하지만 그렇지 않습니다. 이 문제에 대한 버그 리포트가 있습니다 : github.com/jordansissel/xdotool/issues/126
Diego Queiroz

2

이것은 적어도 kde 및 xfce에서 작동합니다 (그놈은 테스트되지 않았지만 작동 할 수도 있음).

1) wmctrl 설치

2) 다음 스크립트를 작성하십시오 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) 실행 가능하게 만드십시오.chmod +x ./close_windows.sh

3) 시작 메뉴에서 close_windows 스크립트를 가리키는 항목을 작성하십시오.

4)이 항목에서 close_windows 스크립트를 실행하십시오.

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


완벽한 솔루션. 또한 VNC에서도 작동합니다. 설치 현지화와 일치하도록 "Desktop $"을 변경해야 할 수도 있습니다 (예 : 포르투갈어는 "Área de trabalho $").
Diego Queiroz

2

Michael HomerGuido van Steen 은 모든 창문을 죽이는 방법을 보여주었습니다. 백그라운드 프로세스가 있으면 종료되지 않습니다. 창이 사라졌지 만 여전히 사용자 인터페이스없이 실행되는 충돌 프로그램을 죽이지 않습니다. 따라서 대신 프로세스를 종료하는 것이 좋습니다.

당신은 실행할 수있는 kill -9 -1해당 사용자로 실행중인 모든 프로세스를 종료 할 수있는 루트가 아닌 사용자로. 키오스크 애플리케이션을 전용 사용자 (어쨌든 키오스크의 표준 구성, 보안의 경우)로 실행하고 세션의 모든 프로세스가 종료되었을 때 키오스크 인터페이스가 다시 시작되도록해야합니다 (키오스크의 표준 구성 임). 견고성을 위해).


0

귀도의 대답은 완벽하게 작동합니다. 필자는 자신의 용도로 Lazarus / FPC로 컴파일 된 작은 Linux / Windows 크로스 컴파일 가능 Pascal 프로그램을 작성했습니다. 이는 wmctrl 명령 또는 이에 상응하는 Powershell windows 명령을 실행합니다.

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.

또한 데스크톱 이름에 대해 Diego가 옳다는 것을 알았으며 Linux 실행 파일은 데스크톱이 "Bureau"인 프랑스어 xfce 환경에서만 작동합니다. 환경 변수에서 데스크탑 이름을 찾을 수 없었습니다 (그리고 문제가되지 않았습니다).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.