6

バックグラウンド プロセス ID は、プロンプトから簡単に取得できます。

$ my_daemon &
$ echo $!

しかし、次のように別のユーザーとして実行したい場合はどうすればよいでしょうか:

su - joe -c "/path/to/my_daemon &;"

my_daemon の PID を取得するにはどうすればよいですか?

4

5 に答える 5

13

簡潔に - かなりの困難を伴います。

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 が追加されます。)

警告: 素晴らしい理論 - テストされていないコード...

于 2011-06-01T06:51:29.530 に答える
1

ここで提示されたアプローチは私にはうまくいきませんでした。これが私がしたことです:

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`
于 2016-02-05T20:31:56.003 に答える
-1

これが私の解決策です

su oracle -c "/home/oracle/database/runInstaller" &
pid=$(pgrep -P $!)

外植

  • pgrep -P $!-親pidの子プロセスを取得します$!
于 2013-01-11T07:16:57.557 に答える