バックグラウンド プロセス ID は、プロンプトから簡単に取得できます。
$ my_daemon &
$ echo $!
しかし、次のように別のユーザーとして実行したい場合はどうすればよいでしょうか:
su - joe -c "/path/to/my_daemon &;"
my_daemon の PID を取得するにはどうすればよいですか?
簡潔に - かなりの困難を伴います。
su'd シェルが子 PID をファイルに書き込み、出力を選択するように調整する必要があります。「dex」ではなく「joe」がファイルを作成することを考えると、さらに複雑なレイヤーが追加されます。
最も簡単な解決策はおそらく次のとおりです。
su - joe -c "/path/to/my_daemon & echo \$! > /tmp/su.joe.$$"
bg=$(</tmp/su.joe.$$)
rm -f /tmp/su.joe.$$ # Probably fails - joe owns it, dex does not
次の解決策は、予備のファイル記述子 (番号 3) を使用することです。
su - joe -c "/path/to/my_daemon 3>&- & echo \$! 1>&3" 3>/tmp/su.joe.$$
bg=$(</tmp/su.joe.$$)
rm -f /tmp/su.joe.$$
割り込みなどが心配な場合 (そしておそらく心配する必要があります)、トラップも行います。
tmp=/tmp/su.joe.$$
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15
su - joe -c "/path/to/my_daemon 3>&- & echo \$! 1>&3" 3>$tmp
bg=$(<$tmp)
rm -f $tmp
trap 0 1 2 3 13 15
(キャッチされたシグナルは、HUP、INT、QUIT、PIPE、および TERM であり、シェル終了の場合は 0 が追加されます。)
警告: 素晴らしい理論 - テストされていないコード...
ここで提示されたアプローチは私にはうまくいきませんでした。これが私がしたことです:
PID_FILE=/tmp/service_pid_file
su -m $SERVICE_USER -s /bin/bash -c "/path/to/executable $ARGS >/dev/null 2>&1 & echo \$! >$PID_FILE"
PID=`cat $PID_FILE`
これが私の解決策です
su oracle -c "/home/oracle/database/runInstaller" &
pid=$(pgrep -P $!)
外植
pgrep -P $!
-親pidの子プロセスを取得します$!