0

注意:我正在运行 Red Hat 6.7

我有一个使用 Linux init 系统配置的服务,可以在机器启动时将进程作为服务启动。这是通过从命令行执行此一次性配置来完成的:

ln -snf /home/me/bin/my_service /etc/init.d/my_service
chkconfig --add my_service
chkconfig --level 235 my_service on

当操作系统重新启动时,服务会按预期启动。

如果服务 (my_service) 崩溃,我还需要重新启动服务。根据我的阅读,我需要做的就是在 /etc/inittab 中添加一个如下所示的条目:

mysvc:235:respawn:/home/me/bin/my_service_starter

my_service_starter 的样子:

#!/bin/bash
/home/me/bin/my_service start

我的理解是,当init系统检测到my_service没有运行时,它会尝试通过运行“my_service_starter”来重启它。

但是,这似乎不起作用。

我需要了解如何告诉 Linux 初始化系统在服务崩溃时重新启动我的服务。

4

2 回答 2

2

给定如下条目:

mysvc:235:respawn:/home/me/bin/my_service_starter

然后 inittab 将:

  1. 称呼/home/me/bin/my_service_starter
  2. 这将调用/home/me/bin/my_service start
  3. ...然后退出,init您的服务也会失败
  4. 所以init/home/me/bin/my_service_starter 再打电话

...等等,这将导致 init 决定您的脚本重生速度太快,之后它将完全忽略它。

由 inittab 启动的进程预计不会退出。如果你真的想使用 inittab 来维护你的服务,你可以删除 /etc/init.d/my_service,然后/etc/inittab你会得到类似的东西:

mysvc:235:respawn:/home/me/bin/my_service

而且您需要确保my_service在前台运行(某些程序默认情况下会自动守护进程,尽管这些程序通常会有某种--run-in-foreground标志)。

如果您使用 systemd 升级到 CentOS 7 或其他系统,这一切都会变得更容易。

您还可以调查“第三方”进程管理器,例如“supervisord”或“runit”,您可以将它们用于 CentOS 6 上的进程监控/重启。

更新

正如 mangotang 指出的那样,我忘记了,RHEL 6 实际上是随 upstart 一起发布的,尽管它几乎完全使用 SysV 风格的 init 脚本。因此,更好的解决方案是创建一个新贵服务。这里有一些合理的入门文档。

于 2016-09-09T15:10:14.030 回答
1

在 RHEL 6.X 上,/etc/inittab 文件顶部显示:

# inittab is only used by upstart for the default runlevel. 
# 
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM

RHEL 6.X 使用 Upstart 而不是 System V init 系统。请参阅 initctl(8) 和 initctl(5) 的手册页,或向 Google 咨询 Upstart。

于 2016-09-09T23:41:56.190 回答