如何让shell脚本忽略返回码、报错信息持续运行?
问题解答
查看命令返回码的方法
Shell 中每个命令执行完成后,都会生成一个整数类型的返回码:返回值为0代表执行成功,非0代表执行失败。你可以通过特殊变量$?获取上一条执行命令的返回码,示例如下:
pm2 delete all echo "pm2 delete all 命令的返回码为:$?"
调整脚本兼容命令执行失败的方案
脚本遇到非0返回码就中断,通常是因为脚本开头开启了严格模式参数set -e/set -eo pipefail,你可以通过两种方式处理:
- 全局关闭严格错误检查:在脚本开头添加
set +e,开启后整个脚本所有命令无论执行成功还是失败,都会继续往下执行。该方式不推荐,会遗漏真正需要处理的异常。 - 单条命令兼容失败场景:给允许执行失败的命令末尾添加
|| true,无论命令本身返回值是多少,该行最终返回值都会是0,不会触发脚本中断,是更推荐的精准控制方案。
针对你给出的runNode.sh脚本,调整后示例如下:
cd /nodeApp && npm run build && pm2 delete all || true && pm2 start UI0 cd /
添加|| true后,即使没有运行中的pm2进程导致pm2 delete all执行失败,后续的服务启动命令也会正常执行。
Docker Tomcat 容器快速停止问题处理
你遇到的容器停止问题,核心原因通常不是命令返回码:Docker 容器的生命周期和 PID 1 进程绑定,执行catalina start时,命令会将 Tomcat 放入后台运行后自身退出,导致 PID 1 进程结束,容器自然终止。
正确的启动方式是使用前台运行命令catalina run,保持主进程常驻。如果需要兼容命令执行失败不中断脚本,可以写成:
catalina run || true
内容的提问来源于stack exchange,提问作者niddddddfier
相关产品推荐
相关产品推荐

