如何关闭所有终端,无论是从bash脚本运行什么或iPython

时间:2017-01-11 18:28:58

标签: regex linux bash shell grep

我运行的终端数量趋于激增,其中大多数并不重要,我的意思是他们无论是什么都没有运行或者是iPython。

在我之前的一个问题How to close all terminals with a bash script that effectively presses Cntrl+Shift+Q in each terminal中,名为webb的用户解释了如何关闭所有没有子进程的终端:

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

我想稍微改编一下这个bash脚本,以便选择运行iPython的进程的ID。

到目前为止我尝试了什么

例如,

的一个输出
pgrep bash | xargs -n1 pstree -p -c

看起来像这样:

bash(793)───ipython(847)───{ipython}(854)
bash(1787)───ipython(2061)───{ipython}(2062)
bash(6018)───ipython(6052)───{ipython}(6053)
bash(6810)───python(13796)───python(15653)───{python}(15657)
bash(7197)───docker-compose(20923)───docker-compose(20924)─┬─{docker-compose}(2+
                                                           ├─{docker-compose}(2+
                                                           ├─{docker-compose}(2+
                                                           ├─{docker-compose}(2+
                                                           ├─{docker-compose}(2+
                                                           ├─{docker-compose}(2+
                                                           ├─{docker-compose}(2+
                                                           ├─{docker-compose}(2+
                                                           ├─{docker-compose}(2+
                                                           ├─{docker-compose}(2+
                                                           ├─{docker-compose}(2+
                                                           ├─{docker-compose}(2+
                                                           ├─{docker-compose}(2+
                                                           └─{docker-compose}(2+
bash(8629)───ipython(19746)─┬─{ipython}(19748)
                            ├─{ipython}(19762)
                            ├─{ipython}(19763)
                            ├─{ipython}(19764)
                            ├─{ipython}(19765)
                            ├─{ipython}(19766)
                            ├─{ipython}(19767)
                            └─{ipython}(19768)
bash(9945)───ipython(31376)─┬─{ipython}(31377)
                            ├─{ipython}(31391)
                            ├─{ipython}(31392)
                            ├─{ipython}(31393)
                            ├─{ipython}(31394)
                            ├─{ipython}(31395)
                            ├─{ipython}(31396)
                            └─{ipython}(31397)
bash(15906)───ipython(15974)───{ipython}(15976)
bash(16302)───xargs(19015)───pstree(19027)
bash(17377)───ipython(17407)───{ipython}(17409)
bash(17797)
bash(22210)───node(26380)─┬─{V8 WorkerThread}(26382)
                          ├─{V8 WorkerThread}(26383)
                          ├─{V8 WorkerThread}(26384)
                          ├─{V8 WorkerThread}(26385)
                          ├─{node}(26405)
                          ├─{node}(26406)
                          ├─{node}(26407)
                          └─{node}(26408)
bash(32331)───ipython(32359)───{ipython}(32361)

我想选择不运行任何进程的pids(在本例中为17797) - 以及运行ipython的进程。据我了解,我想替换命令

grep -v \-

在第二个管道之后选择包含bashipython的这些行或行的模式,该管道选择其中没有连字符的每一行。作为我尝试的第一步(基于教程https://www.cyberciti.biz/faq/grep-regular-expressions/

pgrep bash | xargs -n1 pstree -p -c | grep -v '(\-|ipython)'

但这似乎不起作用,因为输出包含例如docker-compose的行。关于如何使这项工作的任何想法?

1 个答案:

答案 0 :(得分:1)

据我所知,您希望将所有运行bash的终端列表作为主进程并在其中运行ipython?然后我认为你的正则表达式匹配错误的东西,因为使用grep而不是egrep。无论如何,我做了以下事情:

pgrep bash | xargs -n1 pstree -p -c | egrep "^(bash|.*[{]?ipython[}]?)\\([0-9]+\\)$" | cut -d\( -f2 | cut -d\) -f1

为了只实现没有子进程的bash进程,我从开始标志(^)添加了一个匹配,因为ipython(或{ipython})应该是最后一个,将匹配添加到结束标志($),然后构建一个方法处理流程编号。这列出了你需要的东西。

使用cut来简化生活,列出实际的父pid(所以在你的情况下需要实际查杀的过程)