首页 > 解决方案 > 如果进程告诉自己停止运行,则 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导致干净的进程退出而不是返回错误状态代码?

标签: bashubuntuunixrunit

解决方案


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


推荐阅读