Bagaimana cara membunuh semua jendela yang terbuka?

9

Saya ingin menutup semua jendela yang muncul di desktop saya. Saya berpikir untuk melakukan ini pkill, tapi saya hanya bisa membunuh mereka satu per satu, yang bukan yang saya inginkan. Tujuan akhirnya adalah memasukkan skrip ini ke dalam menjalankan kios, itu akan mendeteksi jika perangkat lunak kios berjalan (saya menemukan bagian ini) dan jika tidak, maka akan membunuh semua jendela yang terbuka, dan restart saya perangkat lunak kios.

Joe
sumber
bagaimana memulai kembali gdm atau kdm
Raza

Jawaban:

3

Pendekatan paling sederhana menggunakan xdotool:

xdotool search "" windowkill %@

xdotool search ""daftar setiap jendela. windowkill %@membunuh setiap orang dari mereka; %@merujuk ke semua hasil pencarian sebelumnya.

Anda dapat memilih untuk menggunakan --maxdepth 1opsi untuk searchmembatasi jendela yang dipilih untuk jendela tingkat atas.

Michael Homer
sumber
Sayangnya, itu tidak berfungsi ketika menggunakan VNC (xdotool menimbulkan kesalahan segmentasi).
Diego Queiroz
Itu mungkin bernilai pertanyaan lain - semuanya harus sama di bawah VNC atau tidak.
Michael Homer
Saya setuju, tetapi tidak. Ada laporan bug tentang masalah ini: github.com/jordansissel/xdotool/issues/126
Diego Queiroz
2

ini berfungsi setidaknya untuk kde dan xfce (gnome tidak diuji, tetapi mungkin juga berfungsi):

1) instal wmctrl

2) lalu buat skrip bernama 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) membuatnya dapat dieksekusi:chmod +x ./close_windows.sh

3) buat entri di menu mulai yang mengarah ke skrip close_windows.

4) jalankan script close_windows dari entri ini.

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

Guido van Steen
sumber
Solusi sempurna. Dan itu juga berfungsi dengan VNC. Penting untuk ditambahkan bahwa Anda mungkin perlu mengubah "Desktop $" untuk mencocokkan lokalisasi instalasi Anda (mis. Dalam bahasa Portugis itu adalah "Área de trabalho $").
Diego Queiroz
2

Michael Homer dan Guido van Steen telah menunjukkan cara untuk membunuh semua jendela. Ini tidak akan mematikan proses latar belakang, jika ada. Itu tidak akan membunuh program macet yang jendelanya sudah hilang tetapi masih dijalankan tanpa antarmuka pengguna. Jadi, Anda mungkin lebih memilih untuk membunuh prosesnya saja.

Anda dapat menjalankan kill -9 -1sebagai pengguna non-root untuk membunuh semua proses yang berjalan sebagai pengguna itu. Anda perlu menjalankan aplikasi kios sebagai pengguna khusus (itu adalah konfigurasi standar untuk kios, untuk keamanan) dan untuk memastikan bahwa antarmuka kios memulai kembali ketika semua proses dalam sesi sudah mati (yang juga merupakan konfigurasi standar untuk kios, untuk ketahanan).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
0

Jawaban Guido sangat cocok untuk saya. Saya menulis prog Linux Pascal Linux / cross-compilable kecil yang dikompilasi dengan Lazarus / FPC untuk saya gunakan sendiri, yang meluncurkan perintah wmctrl-nya, atau perintah windows Powershell yang setara:

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.

Saya juga memperhatikan bahwa Diego benar tentang nama desktop, dan executable Linux saya hanya akan bekerja pada lingkungan xfce Prancis dengan desktop bernama "Bureau". Saya tidak dapat menemukan nama desktop di variabel lingkungan (dan itu tidak sepadan dengan masalahnya).

Francois_C
sumber