「bash」バックグラウンドプロセスの PID を取得する

$! を使うと bash でバックグラウンドプロセスの PID が取得できるみたいです。

* test.sh

#!/bin/sh

./sleep A &
./sleep B &
echo $!

wait

* 実行結果

6356
A:6355
B:6356

* sleep.c

#include <stdio.h>
#include <unistd.h>

void main(int argc, char *argv[])
{
 sleep(1);
 printf("%s:%d\n", argv[1],  getpid());
}


上記の結果の通り、複数のバックグラウンドプロセス起動すると、最後に起動したものが取れるという感じです。


これは本題と関係ないわけですが、Tomcat では環境変数 CATALINA_PID を設定すると PID を出力したファイルが生成されますが、これは $! 使っている感じですね。

* catalina.sh の抜粋

    eval "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \
      -Djava.endorsed.dirs="\"$JAVA_ENDORSED_DIRS\"" -classpath "\"$CLASSPATH\"" \
      -Dcatalina.base="\"$CATALINA_BASE\"" \
      -Dcatalina.home="\"$CATALINA_HOME\"" \
      -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \
      org.apache.catalina.startup.Bootstrap "$@" start \
      >> "$CATALINA_OUT" 2>&1 "&"

 - () -

  if [ ! -z "$CATALINA_PID" ]; then
    echo $! > "$CATALINA_PID"
  fi


以上です。