답변:
가장 간단한 방법은 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 스크립트를 실행하십시오.
Michael Homer 와 Guido 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 환경에서만 작동합니다. 환경 변수에서 데스크탑 이름을 찾을 수 없었습니다 (그리고 문제가되지 않았습니다).