为什么这个命令替换没有返回预期值?

时间:2015-12-22 21:57:47

标签: linux bash shell

我使用来自this帖子答案的shell脚本重新启动进程,如果它退出。我需要从这个脚本开始几个进程,所以我要编写另一个脚本来按顺序启动它们。我想在继续启动订单之前检查每个进程是否已成功启动。我写了一个类似的脚本。

#!/bin/sh

launch() {
    exec "$1" "$2" &!

    local pid="$(pidof $2)"
    echo "PID: $pid"

    if [ "$pid" == "" ]; do
            return 1
    done

    return 0
}

launch [looping-script.sh] [process-to-wrap]

exit 0

当我使用launch的有效参数运行此脚本时,脚本和进程开始并显示在ps输出中,但$pid的值为空,函数返回{{ 1}}。但是,如果我将1参数从等式中取出,就像这样。

[looping-script.sh]

然后#!/bin/sh launch() { exec "$1" &! local pid="$(pidof $1)" echo "PID: $pid" if [ "$pid" == "" ]; do return 1 done return 0 } launch [process-to-wrap] exit 0 匹配进程的$pid输出值,函数返回ps。在第一个脚本中我的电话是否有不正确的内容?

0输出如果它有用:

bash --version

2 个答案:

答案 0 :(得分:2)

您没有时间让SELECT DATEFROMPARTS (@CURRENT_YEAR, 1, 1) 开始looping-script.sh。在检查PID之前尝试添加process-to-wrap命令。

sleep

答案 1 :(得分:2)

为什么使用pidof来获取受监控命令的进程ID?如果恰好有多个匹配过程,它将无法执行您想要的操作。 shell可以告诉你它开始的最后一个子shell的PID是什么,例如运行后台管道:

exec "$@" &
local pid=$!
echo "PID: $pid"

另请注意"$@",它可以容纳您要启动的命令的任意数量的参数。