如何解决从后台进程中以另一个用户身份获取PID
| 通过执行以下操作,很容易从提示中获取后台进程ID:$ my_daemon &
$ echo $!
但是,如果我想像其他用户一样运行它,该怎么办?
su - joe -c \"/path/to/my_daemon &;\"
现在如何捕获my_daemon的PID?
解决方法
简洁-有很多困难。
您必须安排su 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.$$
如果您担心中断等(也许应该这样),那么您也可能会陷入困境:
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$!
的子进程
, 我在Linux上采用了上述解决方案,但必须添加睡眠以使子进程有机会启动。
su - joe -c \"/path/to/my_daemon > /some/output/file\" &
parent=$!
sleep 1
pid=$(pgrep -P $parent)
以bash运行,它不喜欢pid=$(pgrep -P $!)
,但是如果我在!
之后添加空格,可以::12ѭ。我附加了额外的$parent
变量,以提醒自己下一次查看脚本时我在做什么。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。