シェルに依存せず、言語に依存しない方法で、Linuxコマンドラインから現在のプロセスID(pid)を取得する方法は?
pidof(8)
には、呼び出しプロセスのpid
を取得するオプションがないようです。もちろん、Bashには$$
-しかし、私の一般的な使用法では、シェル(Bashまたはその他)に頼ることはできません。また、場合によっては、スクリプトやコンパイル可能なプログラムを作成できないため、Bash/Python/C/C++(など)は機能しません。
具体的な使用例は次のとおりです。実行中のpid
を取得したい、 Python-Fabric -basedのリモートSSHプロセス(bashが実行されていると仮定するのを避けたい場合があります)とりわけ、一意のファイル名を持つファイルやディレクトリをコピーおよび/または作成できます(mkdir /tmp/mydir.$$
)。
ファブリック固有の問題を解決できる場合、それは役に立ちますが、長期的な問題は解決しません。将来のすべてのシナリオで汎用的に使用するために、私はただ$$
はBashで配信します。
すばらしい回答+コメント here および here 。 THXすべて。両方を1つの答えに組み合わせて、POSIX-Shell-requiredコンテキストとno-POSIX-Shell-requiredコンテキストでトレードオフのある2つのオプションを提供します。
$$
cut -d ' ' -f 4 /proc/self/stat
here に示されている、両方の方法(他の提案された、機能しない方法)を使用したセッションの例。
(シェルに依存しないことにどれだけ関連/有用かはわかりませんが、可能な限りシェルに依存しないオプションを探す「シェルなしでシステムコールを実行する」制約を何度も経験しているだけです。)
Pythonから:
$ python
>>> import os
>>> os.getpid()
12252
$$
はbash固有ではありません-すべてのPOSIX準拠のシェルで利用可能であると考えています。
これが十分に移植可能であることを願って、/proc/[pid]/stat
の4番目のフィールドであるPPIDに依存しています。
cut -d ' ' -f 4 /proc/self/stat
/proc
の正しい形状のLinux、/proc/[pid]/stat
のレイアウトは、Debian 6.0.1が持っているものと互換性がなく、cut
は別個の実行可能ファイルであり、 Shellビルトインではなく、そのカットはサブプロセスを生成しません。
別の方法として、フィールド4の代わりにフィールド6を取得して、 "セッションリーダー" のPIDを取得できます。対話型シェルは明らかにセッションリーダーになるように設定されており、このIDはパイプとサブシェルの呼び出し全体で同じままである必要があります。
$ echo $(echo $( cut -f 6 -d ' ' /proc/self/stat ) )
23755
$ echo $(echo $( cut -f 4 -d ' ' /proc/self/stat ) )
24027
$ echo $$
23755
ただし、これにより、実行中のシェルの動作に依存するようになります。PIDが実際に必要な場合にのみセッションIDを設定する必要があります。明らかに、これは、対話型ではなくスクリプトを実行するシェルのPIDが必要な場合、スクリプトでも機能しません。
少ない文字で動作が保証されています:
sh -c 'echo $PPID'
Procファイルシステムにアクセスできる場合、/ proc/selfは現在の/ proc/$ pidへのシンボリックリンクです。たとえば、/ proc/self/statの最初の列からpidを読み取ることができます。
Pythonを使用している場合は、os.getpid()を使用できます。