열린 창을 모두 죽이는 방법? 나는 이것을 통해 생각 pkill했지만, 한

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



답변

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

xdotool search "" windowkill %@

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

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


답변

이것은 적어도 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 :


답변

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

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


답변

귀도의 대답은 완벽하게 작동합니다. 필자는 자신의 용도로 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 환경에서만 작동합니다. 환경 변수에서 데스크탑 이름을 찾을 수 없었습니다 (그리고 문제가되지 않았습니다).


답변