我搜索了一下如何做到这一点,但我找不到解决办法。我用的是过程替代原因的必要性。在继续之前,我想等待所有的处理完成。
如何在下面得到<#>'runner‘函数的PID,以便我可以等待它?
基本上,它所做的是执行,然后记录stdout,然后记录错误&将错误记录到stdout。除了无序响应外,效果很好。
"${@}" 1> >(2log) 2> >(2log2scr | tee >&2)
pid=???? # <<< HERE
while [ -e /proc/"$pid" ]; do sleep 0.1; done # <<< HERE我尝试了以下几种方法,但都不起作用:
runner success & > while [ -e /proc/$! ]; do sleep 0.1; done OUTPUTS started running FAILURE: \*\*\*\* 4.4.19(1)-release \*\*\*\* finished running EVAL IS:
谢谢你的帮助。
如果您需要完整的脚本进行测试,那么完整的脚本如下:
#!/bin/bash
logfile='test.log'
logprep() {
local in=$(cat)
in=$(echo "$in" | perl -pe 's/\**//smig') # for proc subst
# Return prepped string
echo -e "preped for logging: '$in'"
}
2log() {
local in=$(cat)
if [ "$in" != '' ]; then
echo -e "$in" | logprep >>"$logfile" # out to logfile
fi
return 0
}
2log2scr() {
local in=$(cat)
# 2scr
if [ "'$in'" != '' ]; then echo -e "$in"; fi
# 2log
if [ "$in" != '' ]; then
echo -e "$in" > >(logprep >>"$logfile") # out to logfile
fi
return 0
}
runner () {
echo -e "started running\n"
"${@}" 1> >(2log) 2> >(2log2scr | tee >&2) # <<< RUNNER
#while [ -e /proc/15435 ]; do sleep 0.1; done # <<< HERE
echo -e "finished running\n"
}
success() {
eval 'version=$(echo "SUCCESS: **** ${BASH_VERSION} ****")'
echo -e "$version"; return 0
}
failure() {
eval 'version=$(echo "FAILURE: **** ${BASH_VERSION} ****")'
echo -e "$version" 1>&2; return 64
}
runner success # to test a successful command
runner failure # to test a command that errs
echo "EVAL IS: $version"发布于 2019-06-13 17:27:33
后台进程的pid可以从$中检索!如果环境变量已放入后台(通过向命令末尾添加a&),即
my-cmd &
echo $!您可以探索的另一个选项是在执行的shell中使用$$ (当前shell的pid)。
exec sh -c 'echo $ > t.pid && sleep 10' &
echo $! # <-- pid of spawned shell
pid=$(cat t.pid) # <-- pid of execed process in shell类似这样的内容将在名为t.pid的临时文件中给出pid。
发布于 2019-06-13 17:48:58
只有这样,我才能在不破坏我的EVAL的情况下工作:
runner () {
echo -e "started running\n"
"${@}" 1> >(2log) 2> >(2log2scr | tee >&2)
while [ -e /proc/$! ]; do sleep 0.1; done
echo -e "$pid finished running\n"
}这里的不同之处在于,我只是简单地访问$!,而没有任何先前的需求。所有的建议都提到$!如果我们像这样调用我们的例程,就会访问:
my-cmd &
echo $!这似乎不是一个要求,我们可以在任何复杂的例程(如"${@}" 1> >(2log) 2> >(2log2scr | tee >&2) without )之后,使用'&‘anywhere简单地访问D4
https://unix.stackexchange.com/questions/524714
复制相似问题