簡體   English   中英

如何使用bash腳本關閉所有終端,該腳本有效地在每個終端中按Cntrl + Shift + Q

[英]How to close all terminals with a bash script that effectively presses Cntrl+Shift+Q in each terminal

我經常有很多終端處於打開狀態,其中一些正在運行重要的進程(例如服務器),而其他終端則什么也沒有運行並且可以關閉。 如果您在其中按Cntrl + Shift + Q ,則“重要的”提示會提示您進行確認,如下圖所示。

在此處輸入圖片說明

我想有一個(bash)腳本,該腳本關閉所有終端,但以上面顯示的模式保留“重要”腳本。 https://askubuntu.com/questions/608914/closing-all-instances-of-terminal-at-once-cleanly中 ,我獲得了以下腳本:

#!/bin/bash

xdotool search --class "terminal" | while read id
do
      xdotool windowactivate "$id" &>/dev/null
      xdotool key ctrl+shift+q
      sleep 0.2
done 

但是,我在運行腳本后發現某些“不重要”的終端仍然保持打開狀態。 上面的腳本中是否可能有錯誤?

執行此操作的另一種方法是殺死任何空閑的bash進程,即沒有子進程的進程。 這也應該關閉其父終端窗口。 它的運行速度比xdotool + sleep 0.2方法快得多。

這是我如何查看bash進程的進程樹:

pgrep bash | xargs -n1 pstree -p -c

輸出:

bash(1470)───startx(1546)───xinit(1568)─┬─Xorg(1569)─┬─{Xorg}(1570)
                                        │            ├─{Xorg}(1571)
                                        │            └─{Xorg}(1572)
                                        └─dwm(1575)
bash(1582)
bash(4004)
bash(4125)
bash(28105)───nvim(17279)─┬─R(17956)─┬─{R}(17958)
                          │          ├─{R}(17959)
...

這里的第一個和最后一個bash具有子進程,我不想殺死它們。 中間的三個可以安全地被殺死,這也將關閉其父終端窗口。 首先,我將通過用“ - ”過濾掉任何行來僅選擇那些行:

pgrep bash | xargs -n1 pstree -p -c | grep -v \-

輸出:

bash(1582)
bash(4004)
bash(4125)

接下來,我將再次使用grep僅包含進程ID號:

pgrep bash | xargs -n1 pstree -p -c | grep -v \- | grep -o '[0-9]\+'

輸出:

1582
4004
4125

最后,殺死他們:

pgrep bash | xargs -n1 pstree -p -c | grep -v \- | grep -o '[0-9]\+' | xargs kill

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM