「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
以上です。