bash - 如果进程告诉自己停止运行,则 Runit 退出并出现错误
问题描述
我看到 runit 出现一些意外行为,不知道如何让它做我想做的事情,而不会在终止期间引发错误。我有一个进程有时知道它应该停止自己而不是让自己重新启动(因此应该sv d
自己调用)。如果我从不更改用户,但如果我在运行时切换到非 root 用户会产生错误,则此方法有效。
我将对finish
这两个示例使用相同的脚本:
#!/bin/bash -e
echo "downtest finished with exit code $1 and exit status $2"
run
按预期工作的脚本(打印downtest finished with exit code 0 and exit status 0
到系统日志):
#!/bin/bash -e
exec 2>&1
echo "running downtest"
sv d downtest
exit 0
run
无法按预期工作的脚本(打印downtest finished with exit code -1 and exit status 15
到系统日志):
#!/bin/bash -e
exec 2>&1
echo "running downtest"
chpst -u ubuntu sudo sv d downtest
exit 0
如果我使用su ubuntu
而不是chpst
.
关于我为什么看到这种行为以及如何修复它的任何想法,以便调用sudo sv d downtest
导致干净的进程退出而不是返回错误状态代码?
解决方案
sv d
如果进程仍在运行,则发送 SIGTERM。这是信号 15,因此错误是以所讨论的方式处理的。
相反,要告诉正在运行的程序在它自己退出后不要再次启动(从而允许这个机会),请改用sv o
( once
) 。
或者,您可以在您期望的时候在脚本中捕获 SIGTERM:
trap 'exit 0' TERM
如果你想让这个有条件:
trap 'if [[ $ignore_sigterm ]]; then exit 0; fi' TERM
...然后运行
ignore_sigterm=1
在触发之前sv d
。
推荐阅读
- javascript - 使用 Bootstrap 或 CSS 调整窗口大小时如何让子 div 保持在其他子元素之上
- python - 使用 pefile 返回 unicodeDecodeError
- asp.net-web-api2 - 通过 jQuery 调用 Web API 时出现 404 Not Found 错误
- ios - PromiseKit AnyPromise 然后崩溃 EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x0000000000000010
- python - Peewee 选择不存在子元素的元素
- r - R中的规则:升力的非常高的衡量标准
- javascript - 将不同类型的 img 设置为特定的高度
- oauth - RingCentral Glip Bot OAuth
- c# - 合并一个帐户 c# 不起作用
- javascript - ReactJS:如何让 Parent 道具在子组件中全局使用