開いているすべてのウィンドウを強制終了する方法は?


9

デスクトップに表示されているすべてのウィンドウを閉じたいのですが。私はでこれを行うことを考えましたがpkill、一度に1つしか殺すことができませんでした。これは私が望んでいることではありません。最終目標は、これをスクリプトに入れてキオスクを実行することです。キオスクソフトウェアが実行されているかどうかを検出し(この部分がわかった)、実行されていない場合は、開いているすべてのウィンドウを強制終了して再起動しますキオスクソフトウェア。


gdmまたはkdmの再起動はどうですか
Raza

回答:


3

最も簡単なアプローチは以下を使用しますxdotool

xdotool search "" windowkill %@

xdotool search ""すべてのウィンドウをリストします。windowkill %@それらのすべてを殺します。以前の検索のすべての結果を%@指します。

--maxdepth 1オプションを使用して、選択searchたウィンドウを最上位のウィンドウに制限することもできます。


悲しいことに、VNCを使用すると機能しません(xdotoolはセグメンテーション違反を発生させます)。
Diego Queiroz 2018年

それはおそらく別の質問に値するでしょう-事はVNCの下で同じであるべきかどうかです。
Michael Homer

私は同意しますが、そうではありません。この問題に関するバグレポートがあります:github.com/jordansissel/xdotool/issues/126
Diego Queiroz

2

これは少なくとも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スクリプトを実行します。

ソース:https : //forum.manjaro.org/index.php?topic=4412.0


完璧なソリューション。また、VNCでも動作します。インストールのローカライズに合わせて「Desktop $」を変更する必要がある場合があることを追加することが重要です(たとえば、ポルトガル語では「Áreade trabalho $」です)。
Diego Queiroz 2018年

2

Michael HomerGuido van Steenはすべてのウィンドウを殺す方法を示しました。これがあっても、バックグラウンドプロセスを強制終了しません。ウィンドウがなくなったが、ユーザーインターフェイスなしで実行されているクラッシュしたプログラムを殺すことはありません。したがって、代わりにプロセスを強制終了することをお勧めします。

あなたは実行することができkill -9 -1、そのユーザーとして実行されているすべてのプロセスを殺すためにroot以外のユーザーとして。キオスクアプリケーションを専用ユーザーとして実行し(いずれにしても、セキュリティのためにキオスクの標準構成です)、セッションのすべてのプロセスが停止したときにキオスクインターフェイスが確実に再起動するようにする必要があります(これはキオスクの標準構成でもあります)。堅牢性のために)。


0

グイドの答えは完璧に機能します。私は自分の使用のために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環境でのみ機能します。私は環境変数でデスクトップ名を見つけることができませんでした(そしてそれは問題の価値がありませんでした)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.