【问题标题】:Conditionally run process in background with bash使用 bash 在后台有条件地运行进程
【发布时间】:2016-12-08 18:46:56
【问题描述】:

我想在后台有条件地运行一个程序,如果条件满足,我们作为守护进程运行,否则我们等待结果:

if [ -z "${CONDITION}" ]; then
    echo "background" && npm install -g yarn &
else
    echo "foreground" && npm install -g yarn
fi

有没有一种速记方法可以做到这一点?(我假设在 else 块中,给出了该进程不会在后台运行的语法)。我想我们也可以有条件地添加“等待”而不是“&”字符。

【问题讨论】:

  • 您的wait 想法对我来说似乎不错。总是从后台开始,做类似[ -n "$CONDITION" ] && wait 的事情?不知道其他的速记方式
  • 您介意添加该解决方案的最佳版本吗?
  • 是什么让您认为可以有条件地添加wait 而不是&
  • 看看我们有一个答案,但你说得对,我说错了..我的意思是使用等待而不是 else 块
  • 其实我没说错,哈哈,如果你切换 if/else 我们有条件地添加 & 字符:)

标签: bash sh


【解决方案1】:

我认为您的wait 想法不错。我想不出更好的方法。

npm install -g yarn &
[ -n "$CONDITION" ] && { echo "waiting for install"; wait; }

不确定您是否想要 echo 的东西,但如果它很耗时,您可能需要一个指示。

HTH

更新:显示其工作原理的简单脚本

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

【讨论】:

  • 我认为我从未见过那些 {} 括号,也许这在语义上是有效的,并将回显和等待分组,但我想你也可以这样做 [ -n "$CONDITION" ] && echo "等待安装" && wait;对吗?
  • 我不确定 daemon 是否可以这样工作,我将对其进行测试,看看是否有效!谢谢
  • 括号确实是这样工作的。它们定义了一种块,在这种情况下,您需要分号。我不确定你的第二条评论是什么意思。我将用一个简单的概念证明来更新我的答案。
  • wait 不带参数将等待 all 后台任务完成,如果这是可能启动多个任务的较长脚本的一部分,这可能不是您想要的在后台。运行 wait $! 来等待最近启动的后台任务会稍微安全一些,或者(更安全)将任务的 pid 存储在变量 (npm_pid=$!) 中,然后使用它 (wait $npm_pid)。
猜你喜欢
  • 1970-01-01
  • 2015-11-30
  • 2013-01-10
  • 2022-11-02
  • 2014-05-29
  • 2023-03-10
  • 2021-04-06
  • 1970-01-01
相关资源
最近更新 更多