- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个运行多个工作进程的 python 程序。因为必须妥善处理以避免孤立进程,所以我实现了一个信号处理程序来关闭所有工作进程。
程序开始时大致是这样的:
signal.signal(signal.SIGTERM, my_signal_handler)
)。我还为 SIGINT
添加了另一个信号处理程序使用相同的处理程序。multiprocessing.Queue
,各个工作人员将结果添加到)。想法是在 3 和 4 中启动的两个单独的线程保持任务在机器中运行。
如果我手动启动它并调用 kill -15 <pid>
或 kill -2 <pid>
它正确地关闭了一切,等待进程到join()
.从文档中读取,runit 发送一个 TERM
到流程,然后是CONT
.但是,在 runit 下运行它,它只显示标准 ok: down: <my_program>: 1s, normally up
, 但进程仍在后台运行(即使是主进程,它也是 UNTOUCHED)。
如果我之后出去手动终止进程,我可以在日志文件中看到它正确关闭。我究竟做错了什么? runit 似乎只杀死了我创建的用于激活 virtualenv 的 3 行 shell 脚本,但留下了实际的 python 进程。
即使我直接运行“运行”脚本,我也可以运行 kill
或 Ctrl+C(与 SIGINT
相同)并正确关闭。
最佳答案
好的,经过一些广泛的测试后,我明白了。
Runit 会将 kill 信号发送到 run
脚本,默认情况下不会传播它。您需要确保最后调用 exec python yourscript.py
。同样,如果您的 run
脚本调用另一个 shell 脚本(即激活您的 virtualenv 或类似脚本的脚本),它也必须使用 exec
执行此操作。
示例:
运行
:
#!/bin/sh
umask 002
2>&1
exec chpst -uanalytics cliscript router
脚本
:
#!/bin/sh
# Resolve script path, assuming that the script resides in $(ABSPATH)/bin
SCRIPTPATH="$0"
if [ -h "$SCRIPTPATH" ]; then
SCRIPTPATH=$(readlink -e "$0")
fi
ABSPATH=$(dirname "$(cd "$(dirname "$SCRIPTPATH")"; pwd -L)")
# Load the virtual environment
source "$ABSPATH/venv/bin/activate"
# Set up environment
export PYTHONUNBUFFERED=1
exec python "$ABSPATH/bin/processing-cli.py" $@
注意当我们将控制“传递”给下一个脚本或 python 本身时调用的 exec
。
关于python - 捕获 runit 发送的信号 (sv stop <id>),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18208487/
我有一个 runit 服务,我用它来运行一个使用 unicorn 的 rails 应用程序。 它的重启命令使用信号 (USR2) 来处理零停机重启。基本上,它会等到新进程准备就绪,然后旧进程才会消亡。
我正在编写一个基于 Phusion baseimage 的小型 Docker 容器它提供开箱即用的 runit。 我将 Cassandra 和 Opscenter 代理放入我的容器中。两者都作为/et
我正在使用 runit 来管理 HAProxy,并希望安全重启以重新加载配置文件(特别是:haproxy -f/etc/haproxy/haproxy.cfg -sf $OLD_PROCESS_ID)
我正在开发基于 Phusion 的 baseimage 构建的 Docker 容器这需要有一些服务只能按需启动。我希望这些服务保留为 runit 服务,我只是希望它们不会在启动时自动启动。 如图所示
我对确保 nginx 始终处于运行状态感到困惑。我的理解 init.d 脚本只是启动和停止 nginx。这样对吗?然后在文档中它说保持守护进程=关闭; 现在,我想使用 runit,下面是我的 runi
我看到 runit 出现一些意外行为,但不确定如何让它执行我想要的操作而不在终止期间抛出错误。我有一个进程,有时知道它应该停止自己而不是让自己重新启动(因此应该调用 sv d 自己)。如果我从不更改用
我正在尝试设置 runit 并登录我的 debian wheezy VM。到目前为止,我已经设法通过以下设置启动 gunicorn 服务: sudo mkdir /etc/sv/gunicorn su
如何在 RUnit 中自动生成测试用例? 例如,假设我有一个简单的 sum() 函数: sum <- function(x, y) { return (x + y) } 我想在一系列不
我有一个运行多个工作进程的 python 程序。因为必须妥善处理以避免孤立进程,所以我实现了一个信号处理程序来关闭所有工作进程。 程序开始时大致是这样的: 启动进程池(启动X个worker) 注册信号
我需要创建一个运行与 rvm 一起安装的 gem 二进制文件的 runit 服务,问题是非登录 bash shell,runit 运行其服务的方式没有 rvm 的正确路径。有没有自动执行此操作的方法?
我一直通过运行 docker 进程(应用程序) docker 运行… 但在 runit 监督 下(runit 就像 daemontools) - 所以 runit 确保进程保持运行,传递信号等。 这合
我的 R 测试存在以下问题。我有测试函数需要更改数据库、计算结果、检查这些结果是否等于测试值并清理数据库。我正在尝试使用来自 MySQL 的事务和来自 RMySQL 的 dbBegin(con) 和
我希望自动安装gcc和runnit。但是当我“sudo apt-get install gcc”时,它会出现一个对话框来选择配置。所以我使用 sudo DEBIAN_FRONTEND=noninter
我正在使用以下内容在我的厨师食谱中同步我的 github 存储库。 branch_name = "master" git "/home/ubuntu/workspace/repo" do
当我手动运行时,PhantomJS 工作正常。 但是当我用 runit 运行它时我在日志中收到此错误: node: ../deps/uv/src/unix/core.c:431: uv__close:
我是一名优秀的程序员,十分优秀!