![在后台启动功能并保存PID](https://linux22.com/image/126429/%E5%9C%A8%E5%90%8E%E5%8F%B0%E5%90%AF%E5%8A%A8%E5%8A%9F%E8%83%BD%E5%B9%B6%E4%BF%9D%E5%AD%98PID.png)
我有一个包含两个函数的脚本。一个函数将另一个函数作为后台进程启动,并返回该进程的 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
。)