用户(非root)级别的服务管理器,用于运行/管理/监控/自动重启守护进程和服务
项目描述
usrsvc
用户(非root)级别的服务管理器,用于运行/管理/监控/自动重启守护进程和服务
旨在管理以服务账户用户运行的服务/守护进程。
设计
usrsvc由两部分组成,usrsvc(启动/停止/重启/获取服务状态的工具)和usrsvcd(守护进程,用于保持服务运行,监控运行中的服务等)。
您可以使用usrsvc独立使用,也可以与usrsvcd结合使用。
无父子关系
与其他服务管理器(如supervisord)不同,usrsvcd不需要是其管理的进程的父进程。这使得usrsvcd可以被重启、更新或根本不运行,而不会影响其管理的服务。
在supervisord的世界里,如果您需要更新正在运行的supervisord,您还必须重启它所管理的所有进程,这会导致不必要的停机。
所有由 usrsvc 或 usrsvcd 启动的服务都以“init”作为父进程(或某些系统配置下的systemd)。
捕获/管理现有进程
由于不需要也不使用父子进程关系,usrsvc可以管理已运行的进程。usrsvc有几种可配置的方式识别和匹配您定义的服务与运行进程。
模块化/弹性
usrsvc不是单一的大守护进程,而是分为usrsvc(启动/停止/重启/状态工具)、守护进程usrsvcd(管理自启动、自动重启、监控工具),以及未来用于Web界面的XLMRPC守护进程。
每个工具只做它需要做的事情,并且设计成可以从任何故障场景中恢复并继续运行。
例如,您可以运行“usrsvcd reread”(或将USR1信号发送到usrsvcd进程),使其尝试重新读取配置。如果新的配置存在错误,它将被记录,并保留旧的配置。如果新的配置通过验证,则更改将被应用到usrsvcd执行的下一组操作。与其他服务管理器不同,usrsvcd不会因配置错误而崩溃。
一些命令/日志条目提供JSON输出,以便外部应用程序解析和使用。
进程监控
usrsvcd提供监控其管理的进程的能力,而不仅仅是停止/启动状态。这些是可配置的、可选的,并且针对每个服务定义(见下文“监控”部分)。
无需root权限/隔离
usrsvc按照安全隔离的最佳实践设计为在服务帐户级别运行,无需root配置或运行中的服务;所有内容都隔离到运行服务的用户帐户(如“web”或“django”)。
每个帐户都有自己的独立配置,并运行自己的usrsvcd实例,为应用程序组之间提供进一步隔离。
简单配置
所有配置都是通过简单的ini风格配置文件完成的,并支持定义和继承默认设置,以防止程序之间重复。
详细
usrsvc和usrsvcd的日志记录非常详细,并尽量具体。所有日志都包含时间戳和有意义的错误代码/描述,以简化甚至可能评估您服务的相关问题。
电子邮件警报
当在程序或程序组上设置“email_alerts”属性时,当监控触发重启或发现程序未运行且由usrsvcd启动时,将发送电子邮件。
进程识别
管理进程的主要方法是通过pidfiles。每个程序都必须在其配置中定义一个pidfile。
当autopid = True(默认)时,usrsvc将管理pidfile。如果您设置autopid = False,则您的应用程序需要生成自己的pidfile(不建议)。
由pid文件识别的进程将与proctitle_re进行比较,如果不匹配,则认为pid文件已过时并删除。
启动进程
当usrsvc启动一个进程时,它将在success_seconds时间内运行,在此期间它将尝试匹配一个进程(基于proctitle_re),并确保在该时间段结束时该进程仍在运行。
当useshell = True时,usrsvc将创建子进程并执行一个bash进程(作为command提供),该进程应该启动您的进程;当useshell = False时,它将直接启动给定的command。
该进程及其子进程,以及它们的子进程等,都将与proctitle_re进行匹配检查。
如果您的进程启动时间较长,您可能需要将success_seconds的默认值增加。
当进程匹配且时间段结束时,usrsvc将写入pidfile(autopid = True)并返回成功,否则将返回失败。
扫描进程
- 当 scan_for_process 为 True(默认值),在没有 pid 文件的情况下,或者 pid 文件被判定为过时时(不匹配 proctitle_re),
usrsvc 将扫描当前用户运行的进程,寻找匹配 proctitle_re 的进程。
如果找到匹配项,它将更新 pidfile,其中包含匹配的程序。
如果可能的话,你应该确保你的应用程序具有唯一的进程标题,这样你就可以安全地将 scan_for_process 设置为 True。
这为通过其他方式启动的服务或被移除或损坏的 pid 文件提供了回退。
除了作为回退外,这还允许你将 usrsvc 连接到任何现有的运行服务,无需重新启动该服务。你可以随时将 usrsvc 连接到任何进程或从任何进程中断开连接。
在扫描后找到的进程的 pid 将被写入 pidfile,这是将进程与名称关联的主要(且最有效)方式。
许多服务都有通过系统调用 setproctitle、python 库 “setproctitle” 等设置唯一进程标题的方法。
建议尽可能地将 scan_for_process 设置为 True,以增加额外的弹性和可管理性。
usrsvc(工具)
“usrsvc” 工具处理服务的启动/停止/重启/状态等基本操作。你可以使用它来管理服务,无论 usrsvcd 是否在运行。
用法:usrsvc(选项)[start/stop/restart/status] [程序名称]
对给定的程序名称执行请求的操作。
可以使用“all”代替“程序名称”,对所有配置的程序执行给定的任务。(参见以下并行部分)
usrsvc 是执行特定服务操作的工具,usrsvcd 是相关的守护进程,用于自动重启/监控等。
选项
--------
并行
在进行启动/停止/重启所有操作时,你可以添加“--parallel”或“-P”来并行执行
对所有项执行操作。
配置
-------
Usrsvc 使用位于 $HOME/usrsvc.cfg (/home/media/usrsvc.cfg) 的配置文件。
文档
-------------
运行“usrsvc --readme”或查看https://github.com/kata198/usrsvc/blob/master/README.md
获取更多文档。
工具将输出一些关于发生情况的基本信息,并给出有意义的返回代码(0 = 成功,否则请参阅https://raw.githubusercontent.com/kata198/usrsvc/master/usrsvcmod/constants.py “ReturnCodes” 对象以获取使用的返回代码列表及其描述)。
Usrsvc 将尽可能详细地识别程序为何无法启动并保持运行,以简化调试。
示例用法
启动
[myuser]$ usrsvc start MagicLooper
[Tue Mar 8 22:14:34 2016] - Started MagicLooper
{‘args’: [‘/home/svcact/bin/MagicLooper.py’], ‘cmdline’: ‘/usr/bin/python /home/svcact/bin/MagicLooper.py’, ‘pid’: 12467, ‘executable’: ‘/usr/bin/python’, ‘running’: True}
状态
[myuser]$ usrsvc status MagicLooper
[Tue Mar 8 22:14:55 2016] - MagicLooper is running
{‘args’: [‘/home/svcact/bin/MagicLooper.py’], ‘cmdline’: ‘/usr/bin/python /home/svcact/bin/MagicLooper.py’, ‘pid’: 12467, ‘executable’: ‘/usr/bin/python’, ‘running’: True}
停止
[myuser]$ usrsvc stop MagicLooper
[Tue Mar 8 22:15:37 2016] - Stopping MagicLooper [12467]
[Tue Mar 8 22:15:37 2016] - MagicLooper terminated
usrsvcd(守护进程)
usrsvcd 守护进程处理配置服务的自动启动、自动重启和监控。它是可选的,但需要高级功能。
用法:usrsvcd(可选:[操作])
Usrsvcd 是 usrsvc 的守护进程部分,它积极监控进程,
提供自动启动、自动重启和其他高级功能。
如果省略“操作”,它将假定默认值,“启动”。
操作
checkconfig - 尝试解析配置文件并验证其正确性,而不影响正在运行的 usrsvcd 实例。在失败时返回非零值。
reread - 向正在运行的 usrsvcd 进程发送 SIGUSR1,这将导致它重新读取配置并立即将更改应用到正在运行的实例。
如果配置文件中存在错误,usrsvcd进程将记录一条消息,并且保持其当前配置状态。
restart - 清洁重启usrsvcd守护进程
status - 检查usrsvcd是否正在运行。失败时返回非零值
stop - 停止运行usrsvcd实例
使用主配置文件$HOME/usrsvc.cfg
当usrsvcd启动时,它会获取任何配置服务的状态(无论它们是否正在运行,它们的pid是多少等)。与其他管理器不同,它不需要重启程序以开始管理。
更新配置
使用usrsvcd,您可以在不影响任何应用程序的情况下添加或删除服务,或更改现有服务的属性。
只需更改配置,并运行usrsvcd checkconfig来验证配置错误。如果有错误,您将收到有关错误的通知,而usrsvcd将继续使用最后一个有效的配置运行。
当您满意并验证了更改后,运行usrsvcd reread来告诉usrsvcd更新其配置的内部副本。usrsvcd在加载新配置之前将执行检查,并在出错时通知您(并保留最后一个有效的配置)。
在验证更改后,usrsvcd将在完成当前操作集后应用更新。这使得您可以在任何时间更新配置,而不用担心应用程序会中断。
不需要重启usrsvcd来应用配置更改。
配置
配置从主配置文件$HOME/usrsvc.cfg开始。该文件定义了一些基本信息,或者可以包含您完整的配置。建议使用方法是提供“config_dir”属性,它指定了一个目录。在该目录中,所有以“.cfg”结尾的文件都将被处理,允许您为每个程序定义自己的配置,默认设置在另一个配置中,等等。这使得管理和服务添加/删除变得简单。
配置是“configobj”风格,这与ini风格相似,但支持子部分。
以下列出了部分及其含义。[Main]必须在$HOME/usrsvc.cfg中定义,但其他部分可以出现在任何配置文件中。
主配置
[Main]
在[Main]部分必须在$HOME/usrsvc.cfg中找到,并且可以包含以下属性中的任何一项
config_dir - 这定义了一个目录,该目录将用于搜索其他配置。任何以“.cfg”后缀结尾的文件都将作为配置进行处理。
pidfile - 必须定义 - 这定义了usrsvcd将存储其自身pid的位置。
usrsvcd_stdout - 如果定义,usrsvcd将日志标准输出到该文件而不是默认的标准输出(可能是终端)。必须是绝对路径。
usrsvcd_stderr - 如果定义,usrsvcd将日志标准错误到该文件而不是默认的标准错误(可能是终端)。使用值“stdout”将标准错误记录到与标准输出相同的位置,否则必须是绝对路径。
sendmail_path - 如果定义并且不是“auto”,则应该是“sendmail”应用程序的路径。当在程序上设置“email_alerts”时,用作发送程序。如果没有定义或为auto,则将检查/usr/sbin/sendmail、/usr/bin/sendmail以及PATH中的每个元素。
程序配置
[Program:myprogram]
每个“Program”部分可以位于任何配置文件中,并定义了将由usrsvc管理的程序。冒号后面的内容是程序名称(在这种情况下为“myprogram”),必须是唯一的。这将为程序分配用于识别程序的名字(例如,“usrsvc start myprogram”)
“Program”部分具有以下属性
command - 必需 - 执行所需的完整命令和参数。如果 #useshell# 为 True,则可以包含 shell 特性。
useshell - 布尔值,默认为 False。如果为 True,将通过 shell 启动您的应用程序。在此模式下,可以使用 shell 表达式。如果不需要此功能,请使用“False”。
pidfile - 必需 - pidfile 的路径。如果 #autopid# 为 False,则您的应用程序必须将 pid 写入此文件。否则,usrsvcd 将管理它,即使使用 #scan_for_process# 或其他方法。
enabled - 布尔值,默认为 True。设置为“False”将禁用程序由“usrsvcd”管理。
autopid - 默认为 True,布尔值。如果为 True,则“usrsvc”和“usrsvcd”将写入启动程序的 pid 到 pidfile 中,即进行管理。如果您的应用程序在 fork-and-exit,可以将此设置为 False 并写入自己的 pid,或使用 #scan_for_process#。
scan_for_process - 默认为 True,布尔值。如果为 True,则在没有与 #proctitle_re# 匹配的 pidfile 的情况下,“usrsvc”和“usrsvcd”将使用 #proctitle_re# 扫描运行进程以查找应用程序。这可以在 pidfile 失踪时找到应用程序。
proctitle_re - 无或与 proctitle 匹配的正则表达式(可以视为“ps auxww”中的最后一列)。如果没有提供,将使用默认设置,其中命令和参数将被使用,几乎适用于所有情况。某些应用程序会修改它们的 proctitle,您可能需要使用此功能来匹配它们。
autostart - 默认为 True,布尔值。如果程序在“usrsvcd”被调用时没有运行,则应启动程序。
autorestart - 默认为 True,布尔值。如果程序在“usrsvcd”运行时停止,则应重启程序。
maxrestarts - 默认 0,整数。表示 usrsvcd 将尝试自动重启应用程序的最大次数。如果看到应用程序自然再次运行,则此计数器将重置。0 表示无限重启。
restart_delay - 默认 0,整数。表示失败“启动”后“usrsvcd”下一次重启尝试的最小秒数。
success_seconds - 默认 2,浮点数。usrsvc 在考虑程序成功启动之前将等待的秒数。在此期间创建的进程必须在结束时匹配并且仍在运行,才能被视为成功。
term_to_kill_seconds - 默认 8,浮点数。表示在 SIGTERM 和 SIGKILL 之间应用程序被给予的秒数。
注意:以下 stdout/stderr 总是以“追加”模式打开。
stdout - 必需 - 用来输出 stdout 的文件的绝对路径。
stderr - 用来输出 stderr 的文件的绝对路径,或“stdout”以重定向到 stdout。默认将 stderr 重定向到 stdout。可能和 stdout 使用相同的文件名。
defaults - 这可以引用其他地方定义的“DefaultSettings”部分,即要引用[DefaultSettings:MySettings],使用“defaults=MySettings”。如果提供,则此程序将继承在 DefaultSettings 中定义的设置作为默认设置。在此程序中明确提供的任何内容都将覆盖默认设置中找到的内容。
inherit_env - 布尔值,默认为 True。如果为 True,将继承来自“usrsvc”或“usrsvcd”的 env。否则,将只使用 Env 子部分中定义的 Env。
email_alerts - 字符串,如果设置,当 usrsvcd 启动/重启进程时,将向此地址发送电子邮件警报。
程序子部分
您的 程序 配置可以包含以下子部分,以及它们的属性。
[[Env]]
一系列 key=value 项,在启动此程序之前将存在于环境中。
[[Monitor]]
Monitor 子部分指定您的 程序 将如何以及是否进行监控。监控可以确定程序是否已停止运行,或超过某些界限,并触发重启。
目前,Monitor 可以包含以下属性
monitor_after - 程序需要运行的最小秒数,在此之后才开始监控。默认 30。0 禁用此功能。
(活动文件监控)
以下两个属性涉及“活动文件”监控,即确保文件或目录在指定的秒数内更新。
activityfile - 每隔#activityfile_limit#秒必须修改的文件或目录,否则程序将被重启。默认为未定义/空字符串,将禁用此功能。
activityfile_limit - 如果已定义activityfile,则这是在触发重启之前,提供的#activityfile#之间可以经过的最大秒数。
(RSS限制监控)
以下属性触发“rss限制”监控。此监控检查常驻集大小(应用程序使用的非共享内存),并在超过给定阈值时重启。
rss_limit - 默认值为0,如果大于零,指定进程在重启之前可以使用的最大RSS(常驻集大小)。这是进程使用的“私有”内存(不包括共享映射等)。
示例程序配置
[Program:myprogram]
command = /home/myusr/bin/myprogram.py arg1 arg2
pidfile = /home/myusr/pids/myprogram.pid
stdout = /home/myusr/logs/myprogram.log
stderr = stdout
[[Env]]
DB_USER = superdb
DB_NAME = mydatabase
可继承设置
您可以在您的config_dir目录中的.cfg文件中定义默认设置,这些设置可以被其他程序继承。使用此功能可以减少重复,并批量更改设置。
将程序的defaults属性设置为DefaultsSettings节点的名称,以使该程序继承这些默认设置。
程序显式定义的任何属性都将覆盖继承的任何默认设置。
示例默认设置
[DefaultSettings:mydefaults]
success_seconds = 5
restart_delay = 3
max_restarts = 3
email_alerts = nobody@example.com
Systemd集成
从1.5.9版本开始,usrsvcd与systemd集成。在源分发中,您将找到一个包含单元和一个安装.sh脚本的“systemd”目录。
如果usrsvcd安装在除“/usr/bin/usrsvcd”之外的位置,您需要修改“usrsvcd@.service”中以“Exec”开头的行,并使用正确的路径。
使用“systemctl start usrsvcd@myuser”以“myuser”身份启动usrsvcd。
使用“systemctl enable usrsvcd@myuser”使usrsvcd在启动时以“myuser”身份启动。
根据usrsvc的设计,您可以针对多个用户启用多个守护进程。
示例
示例配置可以在“examples”目录中找到(https://github.com/kata198/usrsvc/tree/master/examples)。“usrsvc.cfg”是主要配置文件(位于$HOME/usrsvc.cfg),“cfg”目录打算位于“/home/myusr/usrsvc.d/cfg”(根据usrsvc.cfg中的config_dir值)。
联系我
您可以通过电子邮件kata198 at gmail与我联系以获得支持、提问、功能请求或只是告诉我您正在使用它!
更改
变更日志可在以下位置找到:https://raw.githubusercontent.com/kata198/usrsvc/master/ChangeLog
项目详情
usrsvc-1.5.13.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | e65c82573db5bc2c647e1ec9a6ad575f441e6ecd25c8f1bea65c8063fdb5c90a |
|
MD5 | 19009154d275ec6c2f143d7ca55c752b |
|
BLAKE2b-256 | 3cf1b4108553739a25526f845acf517b128809694e0c7a7c1d53ec9c406d0cbc |