请勿永久使用。

请勿永久使用。

/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其别名为svcsvc -d /etc/service/MyApp

我说过它是一系列工具集。事实上,这些工具在幕后都使用相同的协议。

这让我想到了更重要的一点。所有这些工具集都不是独有的。即使您有 runit,这并不意味着您可以execline随意使用。或者,您可以nosh在 s6 的服务管理器下运行脚本。

日志记录

您曾尝试使用 forever 写入日志文件。再次强调,不要使用 forever。这不是使用 runit 进行日志记录的正确方法。将标准输出和错误直接重定向到文件会使您的日志无法旋转、大小限制和其他控制,而不会对守护进程的操作造成严重干扰。

daemontools 系列服务管理器全部通过输出一个进行日志记录主要的通过普通管道连接到另一个输入的服务日志服务。这个管道是服务管理器设置的。你不用自己设置。

日志服务是其他服务。它运行众多可用工具之一,这些工具只是从其标准输入读取数据,然后写入日志目录中一组严格限制大小、自动循环、可按需轮换的日志文件。

这些程序multilogmultilogs6-logtinylogcyclog, 和svlogd您将在 runit 工具包中找到后者。

事实上,你可能会发现,无论谁设置/etc/service/MyApp已经设置中的日志服务/etc/service/MyApp/log。如果没有,日志服务脚本非常简单:

/bin/sh -e #!/bin/sh -e
执行 chpst -uMyApp-log svlogd -t ./main

只需创建一个名为 的用户帐户MyApp-logmkdir /etc/service/MyApp/log/main然后chown MyApp-log /etc/service/MyApp/log/main您就可以离开了。(请注意,main可以是指向您创建目录的其他地方的符号链接。您不必使用/etcrunit 将日志放在 下。我将我的日志目录放在 下/var/log/sv。)

你什么都不做主要的服务用于循环和大小限制日志。循环和大小限制独立发生,在日志服务流程。

进一步阅读

相关内容