upstart 脚本中 grep 失败

upstart 脚本中 grep 失败

我有一个 upstart 配置,用于服务,该服务需要在启动时检查进程是否存在。这听起来相当简单,但我已经尝试了 3 个小时来解决这个问题,但我还是迷茫了。问题似乎是一些 grep 语句导致 upstart 中的脚本退出,从而导致启动服务失败。但 upstart 不会记录任何内容,它只是退出脚本然后就消失了。

以下是触发问题的一些示例行:记录了第一个 echo 及其 grep 的输出,记录了第二个 echo,但没有记录其 grep 的输出。第二个 echo 之后,upstart 退出脚本并停止。问题是添加 -v 选项或其他选项,例如使用 [[:digit:]] 等正则表达式类。我似乎需要转义一些字符,但我不知道该怎么做。简单的 -v 或类似的东西不起作用。

script
  echo grep
  ps ax | grep "postgres: wal writer process" | grep "grep"
  echo grep2
  ps ax | grep "postgres: wal writer process" | grep -v "grep"
end script

有人知道我做错了什么以及如何解决这个问题吗?

答案1

正如解释的那样手册,所有脚本都以 运行sh -e。这意味着任何未处理的命令失败都将以错误终止脚本。如果您的代码可能返回失败,您可以像这样编写代码:

command || true

或者将其包装在条件语句或者其他什么东西中。

顺便说一句,你的代码最好写成

ps ax | grep "[p]ostgres: wal writer process"

也可以看看https://stackoverflow.com/questions/9375711/more-elegant-ps-aux-grep-v-grep

总而言之,你可能会寻找类似的东西

if ps aux | grep '[p]ostgres: wal writer process'
then
    : already running
else
    : start it up
fi

现在grep作为条件的一部分运行,失败不再被视为未处理(即使您没有子句else!),因此它将在下安全运行set -e

相关内容