Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 从作为另一个用户运行的后台进程获取PID_Bash_Pid_Su - Fatal编程技术网

Bash 从作为另一个用户运行的后台进程获取PID

Bash 从作为另一个用户运行的后台进程获取PID,bash,pid,su,Bash,Pid,Su,从提示符处获取后台进程ID很容易,方法是: $ my_daemon & $ echo $! 但如果我想以不同的用户身份运行它,比如: su - joe -c "/path/to/my_daemon &;" 现在,我如何捕获我的_守护进程的PID呢?简洁明了,难度很大 您必须安排su'dshell将子PID写入文件,然后选择输出。考虑到创建文件的是“joe”,而不是“dex”,这又增加了一层复杂性 最简单的解决方案可能是: su - joe -c "/path/to/my_da

从提示符处获取后台进程ID很容易,方法是:

$ my_daemon &
$ echo $!
但如果我想以不同的用户身份运行它,比如:

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

现在,我如何捕获我的_守护进程的PID呢?

简洁明了,难度很大

您必须安排su'dshell将子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
su-joe-c”/path/to/my_daemon&echo\$!>/tmp/su.joe。$$”
bg=$(/tmp/su.joe)$$
bg=$(这是我的解决方案

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$!)
,但是如果我在
后面添加一个空格,就可以了:
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`

只要后台进程的输出被重定向,您就可以将PID发送到标准输出:

su "${user}" -c "${executable} > '${log_file}' 2>&1 & echo \$!"
然后可以将PID重定向到第一个用户而不是第二个用户拥有的文件

su "${user}" -c "${executable} > '${log_file}' 2>&1 & echo \$!" > "${pid_file}"

不过,日志文件确实需要由第二个用户拥有,才能这样做。

这在我看来很符合SO的主题;这是一个关于shell编程的问题,因此属于SO的职权范围。这是一个非常棒的答案。我可能只需要这样:
su-joe-c”/path/to/my_daemon&echo\$!>/tmp/su.joe。$$”
对$!进行转义,在
我的守护进程&
之后不使用分号,这当然也有问题。我将对其进行一点尝试。请确保在$!之后添加一个空格,否则shell可能会对此进行奇怪的解释。为什么会被否决?两行简洁的代码没有使用tmp文件。
su "${user}" -c "${executable} > '${log_file}' 2>&1 & echo \$!"
su "${user}" -c "${executable} > '${log_file}' 2>&1 & echo \$!" > "${pid_file}"