デスクトップに表示されているすべてのウィンドウを閉じたいのですが。私はこれをpkill
を通じて行うことを考えましたが、一度に1つしか殺すことができなかったため、これは望んでいません。最終目標は、これをスクリプトに入れてキオスクを実行することです。キオスクソフトウェアが実行されているかどうかを検出し(この部分がわかった)、実行されていない場合は、開いているウィンドウを強制終了し、再起動しますキオスクソフトウェア。
最も簡単なアプローチは xdotool
を使用します:
xdotool search "" windowkill %@
xdotool search ""
はすべてのウィンドウをリストします。 windowkill %@
それらすべてを殺します。 %@
参照 前回の検索のすべての結果。
--maxdepth 1
オプション からsearch
を選択して、選択したウィンドウを最上位のウィンドウに制限します。
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環境でのみ機能します。私は環境変数でデスクトップ名を見つけることができませんでした(そしてそれは問題を起こすに値しませんでした)。