コマンドラインからGNU / Linuxの特定のプロセスの親PIDを取得する方法は?


90

尋ねられる前に解決されました: cat /proc/1111/status | grep PPid


より高速:のgrep PPid status |cut -f2ようなtime(for((i=0;i<1000;i++));do grep PPid status |cut -f2 >/dev/null;done); もっと速いものがあるのだろうか?
アクエリアスパワー14

1
@AquariusPowerご質問のとおり、fgrepはgrepよりも高速です。fgrep PPid status |cut -f2
jbo5112

sedはgrepおよびcutよりもはるかに高速です。– sed -rn '/PPid/ s/^.*:\s+// p' < status
Marian

回答:


108

コマンドライン:

ps -o ppid= -p 1111

関数:

ppid () { ps -p ${1:-$$} -o ppid=; }

エイリアス(関数が望ましい):

alias ppid='ps -o ppid= -p'

脚本:

#!/bin/sh
pid=$1
if [ -z $pid ]
then
    read -p "PID: " pid
fi
ps -p ${pid:-$$} -o ppid=

関数またはスクリプトにPIDが指定されていない場合、デフォルトで現在のプロセスのPPIDが表示されます。

エイリアスを使用するには、PIDを指定する必要があります。


=記号は、少なくともOS X 10.8.2上で、必要はありません。
jtbandes

5
@jtbandes:ここで使用される等号は、ヘッダー行の出力を抑制します(LinuxおよびOS X)。
デニスウィリアムソン

13

これは私が学び、忘れ、再学習し、繰り返すことの一つです。しかし、それは便利です。pstreeコマンドの「s」フラグは、Nに葉があるツリーを示します。

pstree -sA $(pgrep badblocks)
systemd---sudo---mkfs.ext4---badblocks

12

親pidはシェル変数PPIDにあるため、

echo $PPID

1
はい。ただし、1。他のプロセスの親PIDが必要です。2。すべての祖先を初期化するためにトラバースできるようにします。
Vi。

1
一方、使用$PPIDすることで、Googleがこのページへの回答として提案した問題を解決しました。
ポール・ウィテカー

12

PPIDすべてのプロセスの親ID()を出力するには、次のコマンドを使用します。

ps j

単一プロセスの場合、次のようにPIDを渡すだけですps j 1234

値のみを抽出するにはawk、次のように出力をフィルタリングします。

ps j | awk 'NR>1 {print $3}' # BSD ps
ps j | awk 'NR>1 {print $1}' # GNU ps

すべての親のPIDをリストするには、使用しますpstree(お持ちでない場合はインストールします):

$ pstree -sg 1234
systemd(1)───sshd(1036)───bash(2383)───pstree(3007)

現在のプロセスの親PIDを取得するには、を使用しますecho $$


1
pstree私がここで見た中で一番素敵なものです。
sudo

ps jそれは多くのディストリビューションで利用可能であり、簡単に構成できるため素晴らしいです
コナーマコーミック

6

/ proc / $ PID / statusを読み取ります。簡単にスクリプト化できます:

#!/ bin / sh
P = $ 1
if [-z "$ P"]; それから
    Pを読む
fi
cat / proc / "$ P" / status | grep PPid:| grep -o "[0-9] *"

2
grep '^PPid:' /proc/$1/status | grep -o '[0-9]*'は、あなたが必要とすることすべてです。(Unixツールがこれを行うことは非常にまれif [ -z ]; then readです。)
grawity

それはのようなものを行う行うことができます@grawityecho $$ | ppid | ppid | ppid
Viは。

2
UUOC猫の無駄な使用
フェリペアルバレス14年

@FelipeAlvarez、私の手はタイプに使用されません< /some/file grep | grep | ...
Vi。

2
どうですかgrep /some/file
フェリペアルバレス14年


2
$ ps -p $(ps -p $(echo $$) -o ppid=) -o comm=
    tmux

現在のプロセスを開始した親のコマンドを確認するもう少し複雑な例comm =をcmd =に変更して完全なコマンドを表示する


エコーの無駄な使用?;)
bobbogo

一部の端末では実際に必要です。正直なところ、正確には覚えていませんが、実際には問題を解決しました。:D
sebastian_t


1

などtop、必要なオプションを指定して実行します-u username and -p PID

また、topを押している間ftop出力に表示するオプションのリストが表示され、表示されるパラメーターは大文字で表示され、表示されないパラメーターは小文字で表示されます。

したがって、パラメータの前に文字を入力することにより、有効または無効にできます。親プロセスIDについては、入力してbからを押すEnter必要があり、PPIDがトップ出力に表示されます。


1
非対話的に使用されます。私はすでにhtopあなたのPPID列を設定できることを知っています。
Vi。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.