在bash中有条件地后台运行进程

8
我希望能够根据条件在后台运行程序,如果满足条件,我们将作为守护进程运行,否则等待结果。
if [ -z "${CONDITION}" ]; then
    echo "background" && npm install -g yarn &
else
    echo "foreground" && npm install -g yarn
fi

有没有一种简便方法来完成这个操作?(我假定在else块中,鉴于语法的限制,此进程将不会在后台运行)。我想我们也可以有条件地添加“wait”而不是"&"字符。


1
你的“等待”想法听起来不错。始终在后台启动并执行类似 [ -n "$CONDITION" ] && wait 的操作?我不知道其他的速记方式。 - tgo
你介意加入你认为最好的解决方案吗? - Alexander Mills
你为什么认为你可以有条件地添加一个 wait 而不是一个 & - hek2mgl
看看我们现有的一个答案,但你是对的,我说错了。我是指使用wait而不是else块。 - Alexander Mills
其实我没有说错,哈哈,如果你交换if/else语句,我们就可以有条件地添加&字符 :) - Alexander Mills
Windows有一个“start”命令,您可以在前面加上“$START cmd”,以有条件地在后台启动。对于Linux,请参见https://dev59.com/TXRB5IYBdhLWcg3wiHz7。 - mosh
1个回答

7
我认为你的“等待”想法很好。我想不出更好的方法。
npm install -g yarn &
[ -n "$CONDITION" ] && { echo "waiting for install"; wait; }

不确定你是否需要 echo 的内容,但如果它很耗时间,你可能需要一个指示。

希望有所帮助

更新:演示如何使用的简单脚本

C=""
date
sleep 5s &
[ -n "$C" ] && { echo "waiting"; wait; }
date

如果 C="",那么输出结果如下:

Thu Dec  8 11:42:54 CET 2016
Thu Dec  8 11:42:54 CET 2016

当然,sleep 5s 在您的脚本结束后仍在运行。

如果您设置 C="something",则会得到:

Thu Dec  8 11:42:42 CET 2016
waiting
Thu Dec  8 11:42:47 CET 2016

我不认为我曾经见过那些 {} 括号,也许这在语法上是有效的,并且将 echo 和 wait 分组,但我想你也可以只使用 [ -n "$CONDITION" ] && echo "waiting for install" && wait; 对吧? - Alexander Mills
我不确定守护进程是否像那样工作,我会测试一下看看这是否有效!谢谢 - Alexander Mills
这里的括号确实是这样工作的。它们定义了一种块,在这种情况下需要分号。我不确定你在第二条评论中的意思。我将用一个简单的概念证明来更新我的答案。 - tgo
1
wait 命令不带参数时会等待 所有 后台任务完成,如果这是长脚本的一部分,可能不是您想要的,因为它可能启动多个后台任务。稍微更安全的做法是运行 wait $! 仅等待最近启动的后台任务,或者(更安全)将任务的 pid 存储在变量中 (npm_pid=$!),然后使用该变量 (wait $npm_pid)。 - markusk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接