我运行的终端数量趋于激增,其中大多数并不重要,我的意思是他们无论是什么都没有运行或者是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 \-
在第二个管道之后选择包含bash
和ipython
的这些行或行的模式,该管道选择其中没有连字符的每一行。作为我尝试的第一步(基于教程https://www.cyberciti.biz/faq/grep-regular-expressions/)
pgrep bash | xargs -n1 pstree -p -c | grep -v '(\-|ipython)'
但这似乎不起作用,因为输出包含例如docker-compose
的行。关于如何使这项工作的任何想法?
答案 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(所以在你的情况下需要实际查杀的过程)