如何用一个bash脚本closures所有的terminal,在每个terminal中有效地按下Cntrl + Shift + Q

我经常打开许多terminal,其中一些正在运行重要的进程(例如服务器)以及其他没有运行任何东西并可以closures的进程。 如果你按下Cntrl + Shift + Q ,'重要'提示符会提示确认,如下所示。

在这里输入图像说明

我想有一个(bash)脚本,closures所有terminal,但在上面显示的模式中保留“重要”脚本。 从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 

但是,我发现在运行剧本后,一些“不重要”的terminal仍然是开放的。 上面的脚本中是否有bug?

另一种方法是杀死任何空闲的bash进程,也就是没有子进程的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仅包含进程标识号:

 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