Làm thế nào để giết tất cả các cửa sổ đang mở?


9

Tôi muốn đóng tất cả các cửa sổ xuất hiện trên máy tính để bàn của tôi. Tôi đã nghĩ sẽ làm điều này thông qua pkill, nhưng tôi chỉ có thể giết từng người một, đó không phải là điều tôi muốn. Mục đích cuối cùng là đưa phần này vào tập lệnh để chạy kiosk, nó sẽ phát hiện xem phần mềm kiosk có đang chạy không (tôi đã tìm ra phần này) và nếu không, thì nó sẽ giết bất kỳ cửa sổ nào đang mở và khởi động lại phần mềm kiosk.


làm thế nào về việc khởi động lại gdm hoặc kdm
Raza

Câu trả lời:


3

Cách tiếp cận đơn giản nhất sử dụng xdotool:

xdotool search "" windowkill %@

xdotool search ""liệt kê mọi cửa sổ. windowkill %@giết chết từng người trong số họ; %@đề cập đến tất cả các kết quả của tìm kiếm trước đó.

Bạn có thể thích sử dụng các --maxdepth 1tùy chọn để searchhạn chế các cửa sổ được lựa chọn để cửa sổ cấp cao nhất.


Đáng buồn thay, nó không hoạt động khi sử dụng VNC (xdotool gây ra lỗi phân đoạn).
Diego Queiroz

Đó có lẽ là một câu hỏi đáng giá khác - mọi thứ có nên giống với VNC hay không.
Michael Homer

Tôi đồng ý, nhưng nó không phải là. Có một báo cáo lỗi về vấn đề này: github.com/jordansissel/xdotool/issues/126
Diego Queiroz

2

điều này hoạt động ít nhất cho kde và xfce (gnome chưa được thử nghiệm, nhưng nó cũng có thể hoạt động tốt):

1) cài đặt wmctrl

2) sau đó tạo một tập lệnh gọi là 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) làm cho nó thực thi:chmod +x ./close_windows.sh

3) tạo một mục trong menu bắt đầu trỏ đến tập lệnh close_windows.

4) thực thi tập lệnh close_windows từ mục này.

nguồn: https://forum.manjaro.org/index.php?topic=4412.0 :


Giải pháp hoàn hảo. Và nó cũng hoạt động với VNC. Quan trọng để thêm rằng bạn có thể cần phải thay đổi "Máy tính để bàn $" để phù hợp với nội địa hóa cài đặt của bạn (ví dụ: trong tiếng Bồ Đào Nha, đó là "Área de trabalho $").
Diego Queiroz

2

Michael HomerGuido van Steen đã chỉ ra cách để giết tất cả các cửa sổ. Điều này sẽ không giết quá trình nền, nếu có. Nó sẽ không giết các chương trình bị sập mà cửa sổ đã biến mất nhưng vẫn đang thực thi mà không có giao diện người dùng. Vì vậy, bạn có thể thích giết các quá trình thay thế.

Bạn có thể chạy kill -9 -1như một người dùng không root để giết tất cả các tiến trình đang chạy như người dùng đó. Bạn sẽ cần chạy ứng dụng kiosk với tư cách là người dùng chuyên dụng (dù sao đó cũng là cấu hình tiêu chuẩn cho các ki-ốt, để bảo mật) và để đảm bảo giao diện kiosk khởi động lại khi tất cả các quy trình trong phiên bị chết (cũng là cấu hình tiêu chuẩn cho các kiốt, cho sự mạnh mẽ).


0

Câu trả lời của Guido hoàn toàn phù hợp với tôi. Tôi đã viết một prog Pascal có thể biên dịch chéo Linux / Windows nhỏ được biên dịch bằng Lazarus / FPC để sử dụng cho riêng tôi, nó khởi chạy lệnh wmctrl của anh ta hoặc lệnh windows Powershell tương đương:

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.

Tôi cũng nhận thấy rằng Diego nói đúng về tên máy tính để bàn và tệp thực thi Linux của tôi sẽ chỉ hoạt động trên môi trường xfce của Pháp với máy tính để bàn có tên "Cục". Tôi không thể tìm thấy tên máy tính để bàn trong các biến môi trường (và nó không đáng để gặp rắc rối).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.