我经常打开许多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