web-dev-qa-db-ja.com

シェルに依存せず、言語に依存しない方法でコマンドラインから現在のLinuxプロセスIDを取得する方法

シェルに依存せず、言語に依存しない方法で、Linuxコマンドラインから現在のプロセスID(pid)を取得する方法は?

pidof(8) には、呼び出しプロセスのpidを取得するオプションがないようです。もちろん、Bashには$$-しかし、私の一般的な使用法では、シェル(Bashまたはその他)に頼ることはできません。また、場合によっては、スクリプトやコンパイル可能なプログラムを作成できないため、Bash/Python/C/C++(など)は機能しません。

具体的な使用例は次のとおりです。実行中のpidを取得したい、 Python-Fabric -basedのリモートSSHプロセス(bashが実行されていると仮定するのを避けたい場合があります)とりわけ、一意のファイル名を持つファイルやディレクトリをコピーおよび/または作成できます(mkdir /tmp/mydir.$$)。

ファブリック固有の問題を解決できる場合、それは役に立ちますが、長期的な問題は解決しません。将来のすべてのシナリオで汎用的に使用するために、私はただ$$はBashで配信します。

26
Johnny Utahh

すばらしい回答+コメント here および here 。 THXすべて。両方を1つの答えに組み合わせて、POSIX-Shell-requiredコンテキストとno-POSIX-Shell-requiredコンテキストでトレードオフのある2つのオプションを提供します。

  1. 利用可能なPOSIXシェル: $$
  2. 一般的なコマンドライン: cut -d ' ' -f 4 /proc/self/stat

here に示されている、両方の方法(他の提案された、機能しない方法)を使用したセッションの例。

(シェルに依存しないことにどれだけ関連/有用かはわかりませんが、可能な限りシェルに依存しないオプションを探す「シェルなしでシステムコールを実行する」制約を何度も経験しているだけです。)

2
Johnny Utahh

Pythonから:

$ python
>>> import os
>>> os.getpid()
12252
63

$$はbash固有ではありません-すべてのPOSIX準拠のシェルで利用可能であると考えています。

8
duskwuff

これが十分に移植可能であることを願って、/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が必要な場合、スクリプトでも機能しません。

7
millimoose

少ない文字で動作が保証されています:

sh -c 'echo $PPID'
0
Jordan Samuels

Procファイルシステムにアクセスできる場合、/ proc/selfは現在の/ proc/$ pidへのシンボリックリンクです。たとえば、/ proc/self/statの最初の列からpidを読み取ることができます。

Pythonを使用している場合は、os.getpid()を使用できます。

0
stew