从init.d到新贵,有没有桥梁?


11

我在/etc/init.d中有一个非常好的脚本。实际上,我有很多,都是用Tanuki Java Service Wrapper创建的。

在我看来,可能会有一个简单的模板来将这样的shell脚本包装为新贵的脚本,但是有些搜索并没有显示出来。

我想念什么吗?

Answers:


9

我不记得看到过这样的模板。然而,从技术上来说,这有点讽刺意味,它的新贵首先是由于向后兼容作业rc和rcS来启动init.d脚本。

我会考虑重写任何您拥有的新手工作,但是,我知道有些脚本很难转换,因此这是我一段时间对某些脚本所做的工作:

description "xyz"
author "xyz"
start on runlevel 5
stop on runlevel [!5]

pre-start script
    # do my work here to start the service
end script

post-stop script
    # do work here to stop the service
end script

现在,根据服务的性质,是持久化还是派生本身,您可能需要添加expect fork或添加task到作业文件中。

通常,只是为了完整考虑,这就是完整的新贵工作文件所需要的。所有的预启动工作都已经完成,所有的清理工作都已完成,剩下的唯一的事情就是服务本身,通常会添加以下内容:

exec service_cmd

在新贵公司中,文档说未使用运行级别3,4和5。所以,你只应使用运行级别2
djangofan

已经有一段时间了,但是我很确定5是GUI启动的系统,至少以前是这样。
约瑟夫·罗杰斯

6

因此,暴发户工作的一点是要易于编写。

init.d脚本中有很多shell脚本魔术,这些魔术会反复出现。案例陈述,pidfile跟踪,lsb注释行。还不清楚如何编写一个良好的init.d脚本而不阅读它。

如果您已经经历了编写所有这些文件的麻烦,那么您就不需要新贵的工作,除非,正如我在另一条评论中提到的那样,您需要依赖另一个新贵的工作/事件。

但实际上,暴发户确实使事情变得非常简单。除非需要设置诸如tmpdirs,ulimits或运行时参数之类的内容,否则不需要预启动。除非您要确保在完成服务后收拾整齐(您应该在正常退出后立即对服务进行清理),否则不需要停止服务。

通常,带有许多选项的巨型init.d脚本会归结为10至15行的新手工作。最复杂的init.d脚本可以将大多数逻辑转储到启动前的脚本中。关键在于,它只是一小段代码来设置流程环境,而不是处理启动/停止/重生/等逻辑。

最难的部分是人们何时开始/停止工作,这也是人们最经常出错的部分。start on runlevel [2345]似乎是合乎逻辑的,但忽略了此时网络并行建立以及本地文件系统装入的事实。关键是尝试找出要运行所需的最低限度的东西(其他服务,文件系统,网络等),并在完成时开始。大多数传统的网络服务都应该这样做start on (local-filesystems and net-device-up IFACE!=lo)


3

我认为Upstart与SysV风格的init脚本保持了向后兼容性/etc/init.d。您应该能够仅使用不变的初始化脚本。


可以,但是顺序不再那么容易预测。rc2.d / S99mything脚本运行之前/之后,可能会启动新贵的作业。因此,一旦您依赖新贵托管服务,就需要新贵工作。
SpamapS

2
作为一种技巧,您可以从特定的运行级别中删除init脚本,而是/etc/init.d/myservice start/etc/rc.local正确的顺序添加一堆行,例如to 。这将确保您的服务在所有其他服务(包括由Upstart初始化脚本启动的服务)之后最后启动。
瑞安·汤普森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.