从后台进程中以另一个用户身份获取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
变量,以提醒自己下一次查看脚本时我在做什么。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...