web-dev-qa-db-ja.com

シェル(バッシュ)でpidを取得

私はBashに問題がありますが、その理由はわかりません。
Shellの下に、次のように入力します。

echo $$    ## print 2433
(echo $$)  ## also print 2433
(./getpid) ## print 2602

"getpid"は現在のpidを取得するCプログラムです。

   int main() {
    printf("%d", (int)getpid());
    return 0;
   }

私を混乱させるのはそれです:

  1. 私は "(command)"はサブプロセスだと思います(私は正しいですか?)、そしてそのpidはその親pidとは異なるべきだと思いますが、それらは同じです、なぜ...
  2. 私が括弧の間にpidを表示するために私のプログラムを使うとき、それが示すpidは異なります、それは正しいですか?
  3. $$はマクロのようなものですか?

手伝って頂けますか?

127
ruanhao

$$は、サブシェル内の親のプロセスIDを返すように定義されています。 「特殊パラメータ」のmanページから:

$シェルのプロセスIDに展開されます。 ()サブシェルでは、サブシェルではなく現在のシェルのプロセスIDに展開されます。

bash 4では、BASHPIDを使って子のプロセスIDを取得できます。

~ $ echo $$
17601
~ $ ( echo $$; echo $BASHPID )
17601
17634
172
chepner

以下のいずれかを使用できます。

  • $!は最後のバックグラウンドプロセスのPIDです。
  • kill -0 $PIDは、まだ実行中かどうかを確認します。
  • $$は現在のシェルのPIDです。
70
craken
  1. 括弧は Bashのサブシェル を呼び出します。これはサブシェルにすぎないので、同じPIDを持つ可能性があります。実装によって異なります。
  2. あなたが呼び出すCプログラムはそれ自身のユニークなPIDを持っている独立したプロセスです - それがサブシェルにあるかどうかは関係ありません。
  3. $$は、Bashの 現在のスクリプトのPID のエイリアスです。 ここでの$$$BASHPIDの違い 、およびそのすぐ上のネストレベルを含む追加変数$BASH_SUBSHELLを参照してください。
23

CプログラムにシェルのPIDを表示させたい場合は、getppid()を試してください。

4
Alex

既知のコマンドのPIDを取得する方法を尋ねているのであれば、次のようになります。

以下のコマンドを発行した場合#発行されたコマンドは***でした

dd if =/dev/diskx/=/dev/disky


それからあなたは使うでしょう:

PIDs=$(ps | grep dd | grep if | cut -b 1-5)

ここで何が起こるかというと、必要なすべての固有の文字をフィールドにパイプ処理して、そのフィールドを使用してエコーすることができます

$ PIDをエコー

1

正しいpidを取得するこの1つの方法

pid=$(cut -d' ' -f4 < /proc/self/stat)

同じニースはサブのために働いた

SUB(){
    pid=$(cut -d' ' -f4 < /proc/self/stat)
    echo "$$ != $pid"
}

echo "pid = $$"

(SUB)

出力を確認する

pid = 8099
8099 != 8100
0
ARTEM LAPKIN