【问题标题】:Launch and kill a program in script and continue [duplicate]启动并终止脚本中的程序并继续[重复]
【发布时间】:2019-07-30 09:50:51
【问题描述】:

我有一个脚本需要启动一个程序,以便该程序创建和填充一些文件夹。在脚本继续之前,程序只需要短暂运行然后关闭。

但是,当程序被杀死时,脚本不会继续。我该怎么做?

printf "before"

(timeout -sHUP 3s firefox)

printf "after"

我以为我是在子 shell 中启动程序,但我不确定是否是这种情况。

【问题讨论】:

  • timeout 在终止运行的程序时返回非零退出状态。如果set -e(或等价的set -o errexit)在这种情况发生时有效,则脚本将立即静默停止。括号 ((...)) 确保程序 is 在子 shell 中运行。这不会改变errexit 设置的效果,也不清楚这里为什么使用子shell。
  • 我确实设置了set -o errexit。有什么方法可以专门忽略超时错误但保留errexit

标签: bash process


【解决方案1】:

我解决了这个问题。

set -o errexit

printf "before"

timeout -sHUP 3s firefox || true

printf "after"

另一种清洁方法是

set -o errexit

printf "before"

set +e
timeout -sHUP 3s firefox
set -e

printf "after"

【讨论】:

  • 这根本不是 hack。附加|| : 是一种常见的习惯用法,用于在您不关心时抑制失败命令的退出代码。
【解决方案2】:

printf 接受 2 个参数 - 一个 FORMAT 字符串,然后是一个 ARGUMENT(即要输出的文本)。

当您调用printf "before" 时,您实际上是在传递一个不带参数的格式字符串,该字符串无法正确显示。

最简单的解决方法是改用echo

echo "before"
timeout -sHUP 3s firefox
echo "after"

或者,如果您需要格式化,改为执行例如:

printf "%s\n" "before"
timeout -sHUP 3s firefox
printf "%s\n" "after"

【讨论】:

  • 附录 - printf 可以很好地处理一个参数 - 他只是没有包含换行符,与 echo 不同,它默认不添加。 printf "before\n"
  • stdout 只是为了让示例简洁明了堆栈溢出,程序还有各种其他方法调用和 bash 命令在timeout 之后被忽略。问题似乎在于使用set -o errexit
猜你喜欢
  • 2013-02-16
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-11
  • 1970-01-01
  • 2020-02-02
  • 1970-01-01
相关资源
最近更新 更多