首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我无法得到这个"${@}“1> >(2 2log) 2> >(2 log2scr\ tee >&2)的PID。

我无法得到这个"${@}“1> >(2 2log) 2> >(2 log2scr\ tee >&2)的PID。
EN

Unix & Linux用户
提问于 2019-06-13 16:45:41
回答 2查看 90关注 0票数 0

我搜索了一下如何做到这一点,但我找不到解决办法。我用的是过程替代原因的必要性。在继续之前,我想等待所有的处理完成。

如何在下面得到<#>'runner‘函数的PID,以便我可以等待它?

基本上,它所做的是执行,然后记录stdout,然后记录错误&将错误记录到stdout。除了无序响应外,效果很好。

代码语言:javascript
复制
"${@}" 1> >(2log) 2> >(2log2scr | tee >&2) 
pid=????                                      # <<< HERE
while [ -e /proc/"$pid" ]; do sleep 0.1; done # <<< HERE

我尝试了以下几种方法,但都不起作用:

  1. pid=$(exec sh -c "${@}“1> >(2 2log) 2> >(2 log2scr\2> >&2) )
  2. 这部分工作-它破坏了我的EVAL:

runner success & > while [ -e /proc/$! ]; do sleep 0.1; done OUTPUTS started running FAILURE: \*\*\*\* 4.4.19(1)-release \*\*\*\* finished running EVAL IS:

谢谢你的帮助。

如果您需要完整的脚本进行测试,那么完整的脚本如下:

代码语言:javascript
复制
#!/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"
EN

回答 2

Unix & Linux用户

发布于 2019-06-13 17:27:33

后台进程的pid可以从$中检索!如果环境变量已放入后台(通过向命令末尾添加a&),即

代码语言:javascript
复制
my-cmd &
echo $!

您可以探索的另一个选项是在执行的shell中使用$$ (当前shell的pid)。

代码语言:javascript
复制
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。

票数 1
EN

Unix & Linux用户

发布于 2019-06-13 17:48:58

只有这样,我才能在不破坏我的EVAL的情况下工作:

代码语言:javascript
复制
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"
}

这里的不同之处在于,我只是简单地访问$!,而没有任何先前的需求。所有的建议都提到$!如果我们像这样调用我们的例程,就会访问:

代码语言:javascript
复制
my-cmd &
echo $!

这似乎不是一个要求,我们可以在任何复杂的例程(如"${@}" 1> >(2log) 2> >(2log2scr | tee >&2) without )之后,使用'&‘anywhere简单地访问D4

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/524714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档