将 sysvinit/upstart init 脚本转换为 runit

tgp*_*fer 5 ubuntu init-script sysvinit docker runit

我正在尝试使用 docker -baseimage将当前基于 VM 的基础架构迁移到基于 Docker 的基础架构,它使用 runit/runsv 来启动和监督系统服务。现在,虽然将自己编写的 Python 程序安装为服务显然非常容易,但我正在努力将/etc/init.d/*脚本转换为 runit 服务。

有时这很容易,而且http://smarden.org/runit/runscripts.html 上也有一个列表,但其中一些脚本不适用于(最新版本的)Ubuntu 路径,而且我想知道是否我有时应该将进程嵌入到 chroot 中,或者让它以不同的用户身份运行。

那么,是否有一种安全可靠的方法可以将 Ubuntu 中的 init 脚本转换为简单的 runit-runnable 脚本?

Ave*_*yne 2

简短的回答

目前还没有,没有专门针对 runit 的自动化方法。

长答案

有几种方法可以解决这个问题。

使用预构建脚本

第一个是拥有一组预先构建的脚本。这些可以从其他项目中提取。Void Linux 使用 runit 作为其基础 init 和管理程序,因此它可能会令人感兴趣。Github 上有一个名为runit-scripts 的项目,可能有您需要的一些内容。我将为我自己的项目制作一个无耻的插件,supervise-scripts,其中有一些是预先烘焙好的,尽管该项目仍在开发中。

使用框架

第二是提供一个框架,以简化编写脚本的过渡。 点燃是有可能的。另外,Toki Clover 的监督脚本框架(不要与我自己的项目混淆)也可能提供您所寻求的内容。在这种情况下,没有预先构建的定义,但您可以获得一些 shell 脚本(可能还有其他程序)来帮助您更轻松地进行此转换。

借用现有的脚本和工具

三是借用其他项目的脚本。这意味着要出去真正寻找它们。那里有一些,但你必须真正看看。

以艰难的方式做到这一点

最后,有时您只需要自己编写即可。坦率地说,如果您绝望,请复制原始 /etc/init.d/(whatever) 文件,将其放在一边,然后编辑该文件。通常,在 init.d 脚本的底部,您会找到一个 CASE 语句和朋友,从那里您可以看到是否存在任何不应该存在但却存在的奇怪的内置命令行开关。不要理会任何超出内部start)stop)其中的内容,因为它们在使用主管时不适用。环顾四周,看看它是否需要设置 /var/run/(无论什么)目录,这也总是很重要(如果创建它,请不要忘记设置所有权!)。在顶部,如果作者做得正确,通常会有一组环境变量,其中包含真实的守护程序名称及其选项。从那里您通常可以快速拼凑出一个小脚本。