Как убить все открытые окна?

9

Я хочу закрыть все окна, появляющиеся на моем рабочем столе. Я думал сделать это до конца pkill, но мне удавалось убивать их по одному, а это не то, чего я хочу. Конечная цель - поместить это в скрипт для запуска киоска, он обнаружит, работает ли программное обеспечение киоска (я разобрался с этой частью), а если нет, то он убьет все открытые окна и перезапустит мой программное обеспечение киоска.

Джо
источник
как насчет перезапуска GDM или KDM
Раза

Ответы:

3

Самый простой подход использует xdotool:

xdotool search "" windowkill %@

xdotool search ""перечисляет каждое окно. windowkill %@убивает каждого из них; %@относится ко всем результатам предыдущего поиска.

Вы можете предпочесть использовать --maxdepth 1опцию, чтобы searchограничить выбранные окна окнами верхнего уровня.

Майкл Гомер
источник
К сожалению, он не работает при использовании VNC (xdotool вызывает ошибку сегментации).
Диего Кейроз
Это, вероятно, стоит другого вопроса - все должно быть одинаково под VNC или нет.
Майкл Гомер
Я согласен, но это не так. Об этой проблеме сообщают об ошибке: github.com/jordansissel/xdotool/issues/126
Диего Кейроз,
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 $» в соответствии с локализацией установки (например, на португальском языке это «Área de trabalho $»).
Диего Кейроз
2

Майкл Гомер и Гвидо ван Стин показали способы убить все окна. Это не убило бы фоновые процессы, если они есть. Это не убило бы сбойные программы, окно которых исчезло, но которые все еще выполняются без пользовательского интерфейса. Поэтому вы можете вместо этого предпочесть убить процессы.

Вы можете запускать kill -9 -1как пользователь без полномочий root, чтобы уничтожить все процессы, которые выполняются от имени этого пользователя. Вам нужно будет запустить приложение киоска в качестве выделенного пользователя (в любом случае это стандартная конфигурация для киосков для безопасности) и обеспечить перезапуск интерфейса киоска, когда все процессы в сеансе не работают (что также является стандартной конфигурацией для киосков, для надежности).

Жиль "ТАК - перестань быть злым"
источник
0

Ответ Гвидо отлично работает для меня. Я написал небольшую кросс-компилируемую прогу Pascal для Linux / Windows, скомпилированную с Lazarus / FPC для собственного использования, которая запускает его команду 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.

Я также заметил, что Диего прав насчет имени рабочего стола, и мой исполняемый файл Linux будет работать только во французской среде xfce с рабочим столом под названием «Бюро». Я не смог найти имя рабочего стола в переменных окружения (и это не стоило того).

Francois_C
источник