Answers:
最简单的方法是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用户身份运行以杀死以该用户身份运行的所有进程。您需要以专用用户身份运行信息亭应用程序(无论如何,这都是信息亭的标准配置,以确保安全性),并确保当会话中的所有进程都死机时,信息亭界面会重新启动(这也是信息亭的标准配置,以提高稳定性)。
Guido的答案非常适合我。我编写了一个用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环境中可以使用。我无法在环境变量中找到桌面名称(这是不值得的)。