![每当服务已处于“停止”状态时,“service my_service stop” 即被视为错误。如何在出现错误的情况下继续前进?](https://linux22.com/image/758062/%E6%AF%8F%E5%BD%93%E6%9C%8D%E5%8A%A1%E5%B7%B2%E5%A4%84%E4%BA%8E%E2%80%9C%E5%81%9C%E6%AD%A2%E2%80%9D%E7%8A%B6%E6%80%81%E6%97%B6%EF%BC%8C%E2%80%9Cservice%20my_service%20stop%E2%80%9D%20%E5%8D%B3%E8%A2%AB%E8%A7%86%E4%B8%BA%E9%94%99%E8%AF%AF%E3%80%82%E5%A6%82%E4%BD%95%E5%9C%A8%E5%87%BA%E7%8E%B0%E9%94%99%E8%AF%AF%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E7%BB%A7%E7%BB%AD%E5%89%8D%E8%BF%9B%EF%BC%9F.png)
我有一堆通过 ssh 运行的 bash 命令:
#!/bin/bash
CMD="
set -e
cmd1
cmd2
# ........
service my_service stop
# .........
# some commands here......
# .........
service my_service start
"
ssh -t -A -q -C $SERVER@$HOST "$CMD"
有时,每当my_service
恰好处于停止状态时,命令service my_service stop
就会返回以下内容:
--rpc-eval : RPC failed with reason :nodedown # it's an Erlang app, hence a response
./my_script.sh: línea 26: error: orden no encontrada
由于该命令被视为失败,由于某种原因,它将终止执行,退出会话,从而无法到达该命令service my_service start
。
但我希望它始终运行stop
和以及start
介于两者之间的命令,当然,不管命令之前应用程序的状态如何service stop
,并且不会失败,或者在“服务停止”后尽管可能出现故障仍继续运行
怎么做?
答案1
您的脚本指定了set -e
,如果脚本中的任何命令返回错误,则会导致 shell 退出。如果您省略此项,则默认情况下,如果有任何命令返回错误,脚本将继续。
如果您希望保留set -e
并仅在特定命令返回错误时继续,则可以使用控制运算符 让脚本忽略命令中的错误||
,该控制运算符告诉 shell 在第一个命令失败时执行另一个命令。然后通过指定内置命令:
,它不执行任何操作,只是成功返回(类似于true
您也可以使用的命令)。
例如:
service my_service stop || :
如果service
命令失败,则 shell 将执行:
并返回成功,并且脚本将继续执行。