gpt4 book ai didi

bash - 如果进程告诉自己停止运行,Runit 将错误退出

转载 作者:行者123 更新时间:2023-11-29 09:27:07 24 4
gpt4 key购买 nike

我看到 runit 出现一些意外行为,但不确定如何让它执行我想要的操作而不在终止期间抛出错误。我有一个进程,有时知道它应该停止自己而不是让自己重新启动(因此应该调用 sv d 自己)。如果我从不更改用户,这会起作用,但如果我在运行时切换到非 root 用户,则会产生错误。

我将对两个示例使用相同的 finish 脚本:

#!/bin/bash -e
echo "downtest finished with exit code $1 and exit status $2"

按预期工作的运行脚本(打印downtest finished with exit code 0 and exit status 0 to syslog):

#!/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 到 syslog):

#!/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 之前。

关于bash - 如果进程告诉自己停止运行,Runit 将错误退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51525525/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com