Tüm açık pencereler nasıl öldürülür?


9

Masaüstümde görünen tüm pencereleri kapatmak istiyorum. Bunu yapmayı düşündüm pkill, ama onları birer birer öldürmeyi başardım, ki istediğim bu değil. Son amaç, bir kiosk çalıştırmak için bir komut dosyasına koymaktır, kiosk yazılımının çalışıp çalışmadığını (bu kısmı anladım) algılar ve açık değilse, açık olan tüm pencereleri öldürür ve yeniden başlatır. kiosk yazılımı.


gdm veya kdm'yi yeniden başlatma hakkında
Raza

Yanıtlar:


3

En basit yaklaşım xdotoolşunları kullanır :

xdotool search "" windowkill %@

xdotool search ""her pencereyi listeler. windowkill %@her birini öldürür; önceki aramanın tüm sonuçlarını %@ifade eder .

Sen kullanmayı tercih edebilirsiniz --maxdepth 1seçeneği için searchüst düzey pencereleri seçilen pencereler sınırlamak için.


1
Ne yazık ki, VNC kullanılırken çalışmaz (xdotool bir segmentasyon hatası oluşturur).
Diego Queiroz

Muhtemelen başka bir soruya değer - VNC altında işler aynı olmalı ya da olmamalı.
Michael Homer

Kabul ediyorum, ama değil. Bu sorunla ilgili bir hata raporu var: github.com/jordansissel/xdotool/issues/126
Diego Queiroz

2

bu en azından kde ve xfce için çalışır (gnome test edilmemiştir, ancak aynı zamanda işe yarayabilir):

1) wmctrl yükleyin

2) sonra şu adlı bir komut dosyası oluşturun 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) çalıştırılabilir yapın:chmod +x ./close_windows.sh

3) başlat menüsünde close_windows komut dosyasını işaret eden bir giriş oluşturun.

4) bu girişten close_windows komut dosyasını yürütün.

kaynak: https://forum.manjaro.org/index.php?topic=4412.0 :


Mükemmel çözüm. Ayrıca VNC ile de çalışır. Kurulum yerelleştirmenizle eşleşmesi için "Masaüstü $" ayarını değiştirmeniz gerekebileceğini eklemek önemlidir (örn. Portekizce'de "Área de trabalho $" dır).
Diego Queiroz

2

Michael Homer ve Guido van Steen tüm pencereleri öldürmenin yollarını gösterdiler. Bu, eğer varsa, arka plan süreçlerini öldürmez. Penceresi gitmiş ancak kullanıcı arabirimi olmadan yürütülmekte olan çökmüş programları öldürmez. Bu yüzden süreçleri öldürmeyi tercih edebilirsiniz.

Bu kill -9 -1kullanıcı olarak çalışan tüm işlemleri öldürmek için root olmayan bir kullanıcı olarak çalıştırabilirsiniz. Kiosk uygulamasını özel bir kullanıcı olarak çalıştırmanız gerekir (yine de güvenlik için kiosklar için standart bir yapılandırmadır) ve oturumdaki tüm işlemler öldüğünde kiosk arabiriminin yeniden başlatılmasını sağlamanız gerekir (bu da kiosklar için standart bir yapılandırmadır, sağlamlık için).


0

Guido'nun yanıtı benim için mükemmel. Kendi kullanımım için Lazarus / FPC ile derlenmiş küçük bir Linux / Windows çapraz derlenmiş Pascal prog yazdım, wmctrl komutunu veya eşdeğer Powershell windows komutunu başlatır:

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'nun masaüstü adı konusunda haklı olduğunu ve Linux çalıştırılabilirimin yalnızca "Bureau" adlı masaüstü ile Fransız xfce ortamında çalışacağını fark ettim. Ortam değişkenlerinde masaüstü adını bulamadım (ve sorun değmez).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.