Tho*_*ing 4 script shell upstart escaping
我有一个服务的新贵配置,需要检查它启动时进程的存在。这听起来很容易,但我已经尝试了 3 个小时来解决这个问题,但我迷路了。问题似乎是一些 grep 语句导致 upstart 中的脚本退出,导致启动服务失败。但是 upstart 不记录任何内容,它只是退出脚本并消失了。
以下是触发问题的一些示例行:记录第一个回声及其 grep 的输出,记录第二个回声,但不记录其 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
Run Code Online (Sandbox Code Playgroud)
有没有人知道我做错了什么以及如何解决问题?
如手册中所述,所有脚本都使用sh -e. 这意味着任何未处理的命令失败都将终止脚本并显示错误。如果你有可能返回失败的代码,你会像这样编码
command || true
Run Code Online (Sandbox Code Playgroud)
或将其包装在条件或其他东西中。
顺便说一句,你的代码最好写成
ps ax | grep "[p]ostgres: wal writer process"
Run Code Online (Sandbox Code Playgroud)
所以总而言之,你可能会寻找类似的东西
if ps aux | grep '[p]ostgres: wal writer process'
then
: already running
else
: start it up
fi
Run Code Online (Sandbox Code Playgroud)
现在它grep作为条件的一部分运行,故障不再被视为未处理(即使您没有else子句!),因此它将在set -e.