我有一个 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
。