วิธีฆ่า windows ที่เปิดอยู่ทั้งหมด


9

ฉันต้องการปิดหน้าต่างทั้งหมดที่ปรากฏบนเดสก์ท็อปของฉัน ฉันคิดว่าจะทำสิ่งนี้ผ่านpkillแต่ฉันสามารถจัดการฆ่าพวกมันทีละคนซึ่งไม่ใช่สิ่งที่ฉันต้องการ เป้าหมายสุดท้ายคือการนำสคริปต์นี้ไปใช้เพื่อเรียกใช้คีออสก์มันจะตรวจสอบว่าซอฟต์แวร์คีออสก์กำลังทำงานอยู่หรือไม่ (ฉันคิดส่วนนี้ออกมา) และหากไม่เป็นเช่นนั้นมันจะฆ่าหน้าต่างที่เปิดอยู่ ซอฟต์แวร์คีออสก์


วิธีการเกี่ยวกับการรีสตาร์ท gdm หรือ kdm
Raza

คำตอบ:


3

วิธีที่ง่ายที่สุดใช้xdotool:

xdotool search "" windowkill %@

xdotool search ""แสดงรายการทุกหน้าต่าง windowkill %@ฆ่าทุกคนในพวกเขา; %@หมายถึงผลลัพธ์ทั้งหมดของการค้นหาก่อนหน้า

คุณอาจต้องการที่จะใช้--maxdepth 1ตัวเลือกในการsearchที่จะ จำกัด หน้าต่างเลือกให้หน้าต่างระดับบนสุด


1
น่าเศร้าที่มันไม่ทำงานเมื่อใช้ VNC (xdotool ทำให้เกิดการแบ่งกลุ่มผิด)
Diego Queiroz

นั่นอาจคุ้มค่ากับคำถามอื่น - สิ่งต่าง ๆ ควรเหมือนกันภายใต้ VNC หรือไม่
Michael Homer

ฉันเห็นด้วย แต่มันไม่ใช่ มีรายงานข้อผิดพลาดเกี่ยวกับปัญหานี้: github.com/jordansissel/xdotool/issues/126
Diego Queiroz

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 สิ่งสำคัญที่ควรเพิ่มคือคุณอาจต้องเปลี่ยน "เดสก์ท็อป $" เพื่อให้ตรงกับการติดตั้งในพื้นที่ของคุณ (เช่นในภาษาโปรตุเกสคือ "Área de trabalho $")
Diego Queiroz

2

Michael HomerและGuido van Steenได้แสดงวิธีฆ่าหน้าต่างทั้งหมด สิ่งนี้จะไม่ฆ่ากระบวนการพื้นหลังหากมี มันจะไม่ฆ่าโปรแกรมที่ล้มเหลวซึ่งหน้าต่างหายไป แต่ยังคงดำเนินการอยู่โดยไม่มีส่วนต่อประสานผู้ใช้ ดังนั้นคุณอาจต้องการฆ่ากระบวนการแทน

คุณสามารถเรียกใช้kill -9 -1ในฐานะผู้ใช้ที่ไม่ใช่รูทเพื่อฆ่ากระบวนการทั้งหมดที่ทำงานในฐานะผู้ใช้นั้น คุณจะต้องเรียกใช้แอปพลิเคชันคีออสก์ในฐานะผู้ใช้เฉพาะ (นั่นคือการกำหนดค่ามาตรฐานสำหรับคีออสก์เพื่อความปลอดภัย) และเพื่อให้แน่ใจว่าอินเทอร์เฟซคีออสก์รีสตาร์ทเมื่อกระบวนการทั้งหมดในเซสชันนั้นหยุดทำงาน เพื่อความทนทาน)


0

คำตอบของกุยโด้นั้นเหมาะกับฉันอย่างสมบูรณ์ ฉันเขียน Pascal prog ซึ่งเป็น cross-compilable 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.

ฉันยังสังเกตเห็นว่าดิเอโกนั้นถูกต้องเกี่ยวกับชื่อเดสก์ท็อปและลีนุกซ์ลีนุกซ์ของฉันจะทำงานในสภาพแวดล้อมแบบฝรั่งเศส xfce ด้วยเดสก์ท็อปที่ชื่อว่า "Bureau" ฉันไม่สามารถค้นหาชื่อเดสก์ท็อปในตัวแปรสภาพแวดล้อม (และมันก็ไม่คุ้มกับปัญหา)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.