/etc/service
我在使用启动的脚本时遇到了一个问题runit
。
我的脚本/etc/service/myApp/run
如下所示:
#!/bin/bash
cd /src
forever -l forever.log -o out.log -e err.log -a start bin/www
什么永远所做的就是将我的脚本作为守护进程运行。但这样做似乎让 runit 认为我的服务已经结束/etc/service/myApp/run
,并一次又一次地运行……
我也尝试过运行这个不是作为守护进程,它在前台运行良好,但我仍然遇到一个问题。我有一个干净关闭命令,可以在某个时候发送到我的服务器,最终会关闭前台进程,我不希望它重新启动。但令我沮丧的是,它/etc/service/myApp/run
会立即被调用来重新启动我的服务器 :(
我不是系统管理员,所以这方面的大部分内容对我来说都是新的。我只希望我的脚本在启动时运行,而不是自动重启。感谢您的帮助。
编辑:我更新了我的问题,包括runit
这里使用的事实。我看到 runit 监视进程以保持服务正常运行。但我的问题仍然存在。
答案1
请勿永久使用。
这非常简单。正如您已经观察到的,这里不需要 forever,因为 runit 已经是一个服务管理器,并且已经启动和重新启动了您的程序。
正如你已经注意到的,程序必须执行一些规则run
。它们一定不派生并退出主程序。runit 服务管理器与大多数 daemontools 系列服务管理器(有一整个系列的软件都以这种方式工作)一样,期望运行该run
程序的进程是守护进程。不是它的父进程。不是分叉并退出的短暂的昙花一现的进程。而是实际的守护进程本身。
一个简单的run
程序
有多种脚本语言可以使编写此类run
程序变得轻而易举。 Laurent Bercot 的execline
就是其中之一。 我的nosh
程序是另一个。假设这bin/www
是你的守护进程的实际可执行程序,noshrun
脚本看起来应该像这样:
/bin/nosh 是 #!/bin/nosh 的缩写,意思是“无用” fdmove-c 2 1 复制代码 更改目录/源 宾/www
execline 脚本同样简短。但 shell 脚本不会太长。如果你的run
程序是shell 脚本,要记住的是覆盖外壳程序与您的守护程序在同一个进程中。执行此操作的 shell 命令是exec
,因此 shell 脚本如下所示:
/bin/sh -e #!/bin/sh -e 执行 2>&1 cd /源文件 执行 bin/www
我强烈建议,如果你的程序不需要超级用户权限,那么你执行它通过这chpst
程序(及其-u
选项),以便它以非特权用户身份启动 — — 为了获得最佳效果,最好以专用于此服务的用户身份启动。
run
多年来,许多人收集并发布了一系列程序,其中大多数run
程序都很简短和简单。既然您已经拥有 runit,那么您可以从 Gerrit Pape 自己的run
程序集开始。
启动和停止守护进程
当启动和停止服务时,大多数 daemontools 系列服务管理器都需要被告知停止自动重启服务。它们都附带一个工具来执行此操作。您只需在脚本中使用它即可clean-shutdown
。
- runit 有
sv
程序:sv down /etc/service/MyApp
- s6 具有
s6-svc
程序:s6-svc -d /etc/service/MyApp
- 罪犯有
perpctl
程序:perpctl d /etc/service/MyApp
- daemontools 有
svc
程序:svc -d /etc/service/MyApp
- daemontools-encore 具有
svc
程序:svc -d /etc/service/MyApp
- nosh 有
service-control
程序:service-control --down /etc/service/MyApp
其别名为svc
:svc -d /etc/service/MyApp
我说过它是一系列工具集。事实上,这些工具在幕后都使用相同的协议。
这让我想到了更重要的一点。所有这些工具集都不是独有的。即使您有 runit,这并不意味着您可以execline
随意使用。或者,您可以nosh
在 s6 的服务管理器下运行脚本。
日志记录
您曾尝试使用 forever 写入日志文件。再次强调,不要使用 forever。这不是使用 runit 进行日志记录的正确方法。将标准输出和错误直接重定向到文件会使您的日志无法旋转、大小限制和其他控制,而不会对守护进程的操作造成严重干扰。
daemontools 系列服务管理器全部通过输出一个进行日志记录主要的通过普通管道连接到另一个输入的服务日志服务。这个管道是服务管理器设置的。你不用自己设置。
日志服务是其他服务。它运行众多可用工具之一,这些工具只是从其标准输入读取数据,然后写入日志目录中一组严格限制大小、自动循环、可按需轮换的日志文件。
这些程序multilog
,multilog
,s6-log
,tinylog
,cyclog
, 和svlogd
您将在 runit 工具包中找到后者。
事实上,你可能会发现,无论谁设置/etc/service/MyApp
了已经设置中的日志服务/etc/service/MyApp/log
。如果没有,日志服务脚本非常简单:
/bin/sh -e #!/bin/sh -e 执行 chpst -uMyApp-log svlogd -t ./main
只需创建一个名为 的用户帐户MyApp-log
,mkdir /etc/service/MyApp/log/main
然后chown MyApp-log /etc/service/MyApp/log/main
您就可以离开了。(请注意,main
可以是指向您创建目录的其他地方的符号链接。您不必使用/etc
runit 将日志放在 下。我将我的日志目录放在 下/var/log/sv
。)
你什么都不做主要的服务用于循环和大小限制日志。循环和大小限制独立发生,在日志服务流程。
进一步阅读
- 乔纳森·德·博因·波拉德(2001)。“不要为了“将守护进程放入后台”而使用 fork()。“。 设计 Unix 守护程序时应避免的错误. 常见问题答案。
- 乔纳森·德·博因·波拉德(2014年)。并排查看运行脚本和服务单元。. 常见问题答案。
- https://stackoverflow.com/a/21554947/340790
- https://superuser.com/a/868519/38062
- 格里特·帕普。 运行脚本的集合。