在bash脚本中获取命令的子进程

Posted

技术标签:

【中文标题】在bash脚本中获取命令的子进程【英文标题】:get sub process of commanad inside bash script 【发布时间】:2015-11-26 16:28:25 【问题描述】:

我正在尝试编写一个脚本来获取从 bash 脚本启动的进程的名称和 pid。

示例:

#!/bin/bash
pass=(`command1 | grep .... | tail ... `)&
if [ "$?" = "0" ]; then
    echo "pid of the sub-shell "$!
    echo "pid of the shell "$$       
else
    echo $?
    exit 1
fi

这个脚本的输出是

pid of the sub-process 22725
pid of the shell 22724

我的问题是如何从 shell 脚本中获取 pid 和 command1 的命令,以及传递变量中的命令结果。

    如果我删除“&”,我会得到命令的结果(密码),但不会得到子 shell 的 pid 如果我设置了“&”,我会得到 pid 而不是密码

【问题讨论】:

不要将 code sn-ps 用于 shell 代码。 code sn-ps 是 JsFiddle.com 的 Joel Spolsky 在喝醉时改编的功能。他从未完成他的工作。请改用代码块 好的,还是不行。我需要 3 个值:执行的命令、它的 pid 和命令的值(在我的示例中为密码) 【参考方案1】:

更多的上下文会有所帮助,例如,为什么你需要子shell来输出command1的名称,而你必须写“command1”才能首先在子shell中执行它?

如果要求只是获取子shell进程ID及其结果,请将它们输出到不同的行:

 read pid; read result;  < <(echo $$; echo mypass)

但是,问题表明您希望启动子进程(可能会长时间运行),执行其他活动,然后获取其输出。对于这个尝试命名管道(示例here)或临时文件:

temp=$(mktemp)
command1 ... >$temp &
pid=$!
# other activities here
# ...
wait $pid
read result <$temp

【讨论】:

以上是关于在bash脚本中获取命令的子进程的主要内容,如果未能解决你的问题,请参考以下文章

Bash命令在终端中有效,但在python脚本中的“子进程”中无效[重复]

bash变量

bash脚本变量变量类型

如何从 bash 获取 telnet 命令的输出?

如何在 Ruby 脚本中为命令 shell 获取环境变量?

bash -- 杀死命令脚本 [重复]