我有一个 Nginx 网络代理、gunicorn 网络服务器和一个 python/flask 网络应用程序。Gunicorn 进程显然已经死了,我想在未来通过研究一种实用程序来改善这一点,该实用程序可以在 gunicorn 进程再次崩溃时监控并重新启动它。
我发现了几个可以完成这项工作的流程监督实用程序:
是否有一篇综合文章比较和对比了用于监视和重新启动进程的各种实用程序?
我想要一个自定义的“停止”脚本runit
( runsv
) 在必须停止/重新启动进程时执行。目前它只是终止进程,然后运行“完成”脚本。但就我而言,我的进程会动态生成子进程,因此kill
我需要 a"killtree"
来摆脱它们,而不是 simple 。我怎么做?
我知道它应该通过control
runit的选项来完成,但是从阅读文档来看,我并不清楚应该如何命名停止脚本:(
我试图弄清楚为什么 runit 无法启动或给我托管应用程序的状态。在 Ubuntu 12.04 上运行。
我创建了 /service、/etc/sv/myapp(其中包含一个运行脚本、一个配置文件、一个日志文件夹和一个运行脚本)。我创建了一个从 /service/ 到 /etc/sv/myapp 的符号链接
当我跑
sudo sv s /service/*
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
warning: /service/myapp: unable to open supervice/ok: file does not exist
Run Code Online (Sandbox Code Playgroud)
我的一些谷歌搜索显示,据说重新启动 svscan 服务可能会解决这个问题,但杀死它并运行 svscanboot 并没有什么区别。
有什么建议?我在这里的某个地方错过了一步吗?
我看到很多人将 monit 与 runit 结合使用。那不是多余的吗?使用 runit 又有什么意义呢?是不是因为它在处理服务时更可靠(因为它不依赖于 pidfiles)?
谢谢!
我在使用 runit 设置带有日志记录的服务时遇到问题。以下是我根据 runit 的文档和我在互联网上找到的其他资源创建的文件和脚本的简要概述:
我在 debian 下使用 runit,因此:
/etc/service/test
是到 的符号链接/etc/sv/test
。
下/etc/sv/test
:
$ ls /etc/sv/test
finish log run
Run Code Online (Sandbox Code Playgroud)
并且/etc/sv/test/log
:
$ ls /etc/sv/test/log
config run
Run Code Online (Sandbox Code Playgroud)
该run
脚本:
$ cat /etc/sv/test/run
#!/bin/sh
touch /tmp/pid
echo $$ > /tmp/pid
while true; do
date
sleep 3
done
Run Code Online (Sandbox Code Playgroud)
该finish
脚本:
$ cat /etc/sv/test/finish
#!/bin/sh
kill `cat /tmp/pid`
Run Code Online (Sandbox Code Playgroud)
和log
脚本:
cat /etc/sv/test/log/run
#!/bin/sh
exec svlogd -t /var/log/test
Run Code Online (Sandbox Code Playgroud)
目录/var/log/test
存在,服务运行。
$ sv s test
run: test: …
Run Code Online (Sandbox Code Playgroud) 我有这个 runit 服务run
和log/run
脚本正常工作。
碰巧的是,服务本身可能会因外部原因而崩溃,并且可能在几分钟内无法启动。runit 处理这种情况的默认方式是每隔几秒钟重新启动服务。我该如何改变这种行为?
我的最后一个想法是添加一个check
脚本并在那里做一些魔术,但这似乎比应该的要复杂得多。有没有更好更简单的方法?
我正在 AMI Linux 盒子上的 jenkins 服务器上运行无头 selenium 进程,所有进程均由 runit 管理。
问题是,发出“sv stop selenium”或“sv reload selenium”不会终止或杀死其子进程中的旧实例,而只是将它们与runsv进程分离,因此它们在runit不知道的情况下继续运行,从而导致尝试重新启动服务失败。
我认为我的问题与此有关: How to write runit custom stop script
意思是:我可能应该尝试自定义 d 控制脚本,以便手动清理。
我遵循这个想法: /sf/ask/27441571/
然而,从 /etc/sv/selenium/supervise/pid 中获取 pid 并将其转发到循环并没有任何区别。
有什么建议吗?
sv运行脚本:
#!/bin/sh
exec 2>&1
exec chpst -u jenkins -U jenkins /usr/bin/xvfb-run \
--server-args="-screen 0 1024x768x32" \
/usr/bin/java -jar /usr/local/bin/selenium-server-standalone-2.42.1.jar \
-ensureCleanSession \
-browserSessionReuse
Run Code Online (Sandbox Code Playgroud) 我对 runit 很陌生。我将它安装在 Ubuntu 主机上。
我做了什么:
1)创建的DIRtestrun
在/etc/sv
2)创建的脚本run
中/etc/sv/testrun/run
,脚本内容:
#! /bin/bash
exec /root/FP/annotate-output python /root/FP/test.py | logger -t svtest
Run Code Online (Sandbox Code Playgroud)
3)如果我直接调用 /etc/sv/testrun/run 它执行成功
4)我运行sv start testrun
(或sv run testrun
, sv restart testrun
),所有这些都以相同的错误消息结束:
fail: sv: unable to change to service directory: file does not exist
Run Code Online (Sandbox Code Playgroud)
任何想法我做错了什么?我是 runit 的新手,所有操作都基于此处找到的信息:http ://smarden.org/runit/
安装runit
在 Debian 7.4 中的 Vagrant 中。
我的运行脚本正在运行,但是当我创建 service/pants/log/ 目录时,我开始收到以下错误:unable to open supervise/ok
. 我的服务继续运行,但没有记录任何内容。
我尝试了两种不同的服务,但都有相同的问题。
我尝试了各种不同的服务/裤子/日志/运行脚本(主要使用 svlogd),我尝试更改所有内容的权限(a+rwx),存储日志的目录存在并且具有相同的权限。
如果我直接从命令行运行 svlogd,它会按预期工作。
下面的 bash 日志显示了当我重命名/etc/service/pants/_log
为/etc/service/pants/log
并再次返回时会发生什么/etc/service/pants/_log
。
root@vwb-debian-wheezy:/etc/service# sv s pants/
run: pants/: (pid 29260) 44931s
root@vwb-debian-wheezy:/etc/service# mv pants/{_,}log/
root@vwb-debian-wheezy:/etc/service# sv s pants/
run: pants/: (pid 29260) 44963swarning: pants/: unable to open supervise/ok: file does not exist
; run: log: (pid 29260) 44963s
root@vwb-debian-wheezy:/etc/service# cat pants/log/run
#!/bin/sh
exec svlogd -ttt /var/log/service/pants/
root@vwb-debian-wheezy:/etc/service# ll pants/
total 12 …
Run Code Online (Sandbox Code Playgroud) runit ×9
daemon ×2
daemontools ×2
logging ×2
service ×2
unix ×2
debian ×1
init ×1
jenkins ×1
linux ×1
monit ×1
monitoring ×1
selenium ×1
supervisord ×1
ubuntu-12.04 ×1
upstart ×1