在后台启动功能并保存PID

在后台启动功能并保存PID

我有一个包含两个函数的脚本。一个函数将另一个函数作为后台进程启动,并返回该进程的 UID。只要我不想将 PID 放入专用变量中,这种方法就很有效。一旦我尝试将 PID 分配给变量,脚本就会挂起,直到后台操作完成。

此行为可以通过以下脚本演示:

#!/bin/sh

foo () {
    bar &   # start bar in background
    echo $! # return bars' PID
}

bar () {
    sleep 5 # some background operation
}

FOO=$(foo) # remember the PID of bar
echo $FOO  # expectation: should echo immediately
           # reality: echo after five seconds

所以,我的问题是:如何让脚本在启动bar函数后继续执行,而不等待bar返回?

答案1

由其启动的子 shell$(foo)必须完全退出(以及任何后台进程),以便主 shell 知道命令替换不会捕获更多输入。毕竟,bar睡眠后可以输出一些东西。

但是您可以将输出重定向bar/dev/null

foo () { 
    bar > /dev/null &
    echo "$!"
}

或者(在 Bash 或 ksh 中)取消命令替换并bar在主 shell 中运行:

foo() {
    typeset -n _pid=$1
    bar &
    _pid=$!
}
foo FOO
echo "$FOO"

eval(或与标准中的等效项sh。)

相关内容