![](/img/trans.png)
[英]How to close all terminal either running nothing or iPython from a bash script
[英]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.