gpt4 book ai didi

linux - 如何使用在每个终端中有效按下 Ctrl+Shift+Q 的 bash 脚本关闭所有终端

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:09:15 26 4
gpt4 key购买 nike

我经常打开很多终端,其中一些正在运行重要的进程(例如服务器),而另一些则没有运行任何东西并且可以关闭。如果您在其中按 Cntrl+Shift+Q,“重要”的会弹出确认提示,如下所示。

enter image description here

我想要一个 (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 -r -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 -r -n1 pstree -p -c | grep -v \-

输出:

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

接下来,我将再次使用 grep 来只包含进程 ID 号:

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

输出:

1582
4004
4125

最后,杀了他们:

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

关于linux - 如何使用在每个终端中有效按下 Ctrl+Shift+Q 的 bash 脚本关闭所有终端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40406591/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com