获得一个后台进程ID后台进程获取一个PID容易被去从提示符下执行:从运行作为另一个用户
$ my_daemon &
$ echo $!
但如果我要运行它像一个不同的用户是什么:
su - joe -c "/path/to/my_daemon &;"
现在我该如何捕获my_daemon的PID?
获得一个后台进程ID后台进程获取一个PID容易被去从提示符下执行:从运行作为另一个用户
$ my_daemon &
$ echo $!
但如果我要运行它像一个不同的用户是什么:
su - joe -c "/path/to/my_daemon &;"
现在我该如何捕获my_daemon的PID?
简洁 - 有很多难度。
您必须安排su'd shell将子PID写入文件,然后选择输出。鉴于它将是'joe'创建文件而不是'dex',这增加了另一层复杂性。
最简单的解决方案可能是:
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.$$
如果你担心中断等(和你应该be),那么你也陷阱:
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,IN T,QUIT,PIPE和TERM - 加0壳退出)
警告:好的理论 - 未经测试的代码...
真棒回答。我或许可以通过这个来获得:'su - joe -c“/ path/to/my_daemon&echo \ $!> /tmp/su.joe。$$”'转义$!在'my_daemon&'后面也没有分号。我会稍微玩一下。 – Dex 2011-06-01 06:55:55
请务必在$!后添加空格或者shell可能会奇怪地解释这个。 – 2013-12-12 00:35:41
这里是我的解决方案
su oracle -c "/home/oracle/database/runInstaller" &
pid=$(pgrep -P $!)
移出
pgrep -P $!
- 获取父pid的子进程$!
为什么这是低调的?两行简洁的代码,不使用tmp文件。 – koola 2013-12-05 14:20:05
我在Linux上采用了上述解决方案,但必须添加睡眠以使子进程有机会启动。
su - joe -c "/path/to/my_daemon > /some/output/file" &
parent=$!
sleep 1
pid=$(pgrep -P $parent)
在bash运行,它不会像pid=$(pgrep -P $!)
,但如果我的!
后添加一个空格这是确定:pid=$(pgrep -P $!)
。我坚持使用额外的$parent
变量来提醒自己下次看剧本时我正在做什么。
这里介绍的方法不适用于我。以下是我所做的:
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`
对于我而言,这看起来非常稳定;这是一个关于shell编程的问题,因此在SO的职责范围内。 – 2011-06-01 06:52:37