回答:
最も簡単なアプローチは以下を使用しますxdotool
:
xdotool search "" windowkill %@
xdotool search ""
すべてのウィンドウをリストします。windowkill %@
それらのすべてを殺します。以前の検索のすべての結果を%@
指します。
--maxdepth 1
オプションを使用して、選択しsearch
たウィンドウを最上位のウィンドウに制限することもできます。
これは少なくともkdeとxfceで動作します(gnomeはテストされていませんが、動作する可能性もあります):
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
、そのユーザーとして実行されているすべてのプロセスを殺すためにroot以外のユーザーとして。キオスクアプリケーションを専用ユーザーとして実行し(いずれにしても、セキュリティのためにキオスクの標準構成です)、セッションのすべてのプロセスが停止したときにキオスクインターフェイスが確実に再起動するようにする必要があります(これはキオスクの標準構成でもあります)。堅牢性のために)。
グイドの答えは完璧に機能します。私は自分の使用のためにLazarus / FPCでコンパイルされた小さなLinux / Windowsクロスコンパイル可能なPascal progを書きました。彼の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環境でのみ機能します。私は環境変数でデスクトップ名を見つけることができませんでした(そしてそれは問題の価値がありませんでした)。