2017-01-11 9 views
0

実行している端末の数は増えていく傾向があり、そのほとんどは重要ではないため、何もiPythonを実行していません。私の以前の質問、How to close all terminals with a bash script that effectively presses Cntrl+Shift+Q in each terminalの一つで何も実行していない端末や、bashスクリプトからiPythonを終了する方法

webbという名前のユーザーがいないサブプロセスとすべての端末を閉じる方法を説明した:

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

私はまた、プロセスのIDを選択するには、多少このbashスクリプトを適応したいと思いますiPythonを実行しています。私はこれまで

例として試してみた何

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) 

私はPIDを選択したいのですが何も実行していないプロセス(この場合は17797)と実行中のプロセス(ipython)私はそれを理解したように、私は、このような線やbashipythonの両方を含む行のいずれかを選択したパターンに、その中にハイフンなしですべての行を選択する第2のパイプ、後コマンドに

grep -v \- 

を交換したいと思います。最初のステップとして、私は(チュートリアルhttps://www.cyberciti.biz/faq/grep-regular-expressions/に基づく)

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

を試みたが、この出力は、例えば、docker-composeと行を含むように動作しないと思われます。どのようにこの作品を作るためのアイデアですか?

答えて

1

私は、bashをプライマリプロセスとして実行し、その内部にipythonを実行しているすべてのターミナルの一覧を知りたいと思いますか?それから、egrepの代わりにgrepを使うため、あなたの正規表現が間違ったものにマッチしていると思います。いずれの場合においても、私は以下でした

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

サブプロセスなしのみbashのプロセスを達成するために、私は(^)開始フラグの一致を添加しipython(または{ipython})が最後でなければならない、追加終了フラグ($)に一致し、プロセス番号を処理する方法を構築しました。これは必要なものをリストします。

実際の親のPID(そう、あなたのケースでは、実際の殺害を必要とするプロセス)

+0

1つの追加のノート一覧表示するには、カットを使用したことは、簡単なこと: 'pgrepコマンドはbashの結果の一つを| xargs -n1 pstree -p -c'は 'bash(4090)──ipython(4116)──{ipython}(4117)'ですが、 'kill 4090'だけでは窓; 'kill -9 4090'が必要です。だから私の '.bashrc'ファイルに追加した完全なコマンドは' alias cls = "pgrep bash | xargs -n1 pstree -p -c | egrep '^(bash |。* [{]?ipython []]?)\\([0-9] + \\)$ '| cut -d \(-f2 | cut -d \)-f1 | xargs kill -9 "' –

関連する問題