注文する:

注文する:

特定の画面で実行されているプロセスのすべてのPIDを一覧表示するコマンドをどのように実行できますか? (複数のタブが開いているので、いくつかのbashプロセスが実行されていると仮定します)次の投稿が見つかりました。スクリーンセッションでどのコマンドが実行されているかをご覧ください。

このコマンドは、画面上のプロセスが 1 つだけ実行された場合に機能しますが、画面セッションに複数のタブが開いている場合は失敗します。私が得るエラーは次のとおりです。

注文する:

ps u -p $(ps -el | grep $(ps -el | grep 28572 | grep bash | awk '{print $4}') | grep -v bash | awk '{print $4}')

出力:

grep: 28573: そのファイルまたはディレクトリがありません。

修正する:

次のコマンドシーケンスは予想される結果を生成します。

  1. すべての画面プロセスをインポートする

    ps waux | grep -i screen | grep -v grep | awk '{print $2}' | paste -s -d,
    
  2. スクリーンセッションで実行されているすべてのプロセスをインポートする

    pgrep -P $(ps waux | grep -i screen | grep -v grep | awk '{print $2}' | paste -s -d,) | paste -s -d,
    
  3. スクリーンセッションで実行されているプロセスで実行されているすべてのJavaプロセスを取得する

    ps -w -p $(pgrep -P $(pgrep -P $(ps waux | grep -i screen | grep -v grep | awk '{print $2}' | paste -s -d,) | paste -s -d,) | paste -s -d,) | grep java
    

指示:

  1. java私はスクリーンセッション内で実行されているプロセスにのみ興味があります。
  2. 私はこのコマンドを使用してコンマ区切りのプロセス識別子のリストを取得し、コマンドpasteオプションの引数として使用します。-Ppgrep

アップデート2:

pasteこのコマンドを使用しない方法が見つかりましたxargs

ps waux | grep -i screen | grep -v grep | awk '{print $2}' | xargs -I{} pgrep -P {} | xargs -I{} pgrep -P {} | xargs -I{} ps -w -p {} |  grep java

答え1

ただし、この方法はスクリーンセッションが開いている場合にのみ機能します。

ps waux | grep screen$ | awk '{print $2}' | xargs pstree

例えば

jeff@linux:~$ ps waux | grep screen$ | awk '{print $2}' | xargs pstree
screen───screen─┬─bash───top
                ├─bash───watch
                └─bash───xargs───pstree

複数のスクリーンセッションがある場合は、次のように繰り返すことができます。

jeff@jlinux:~$ for pid in $(ps waux | grep screen$ | awk '{print $2}'); do pstree $pid; done
screen───screen───bash
screen───screen─┬─bash───top
                ├─bash───watch
                └─bash───pstree

関連情報