在Red Hat 6.7中,inittab在服务崩溃后没有重新启动服务

时间:2016-09-09 14:54:09

标签: linux redhat init restart inittab

注意:我正在运行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:重生:/首页/我/斌/ my_service_starter

my_service_starter的样子:

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

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

然而,这似乎不起作用。

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

2 个答案:

答案 0 :(得分:1)

给出如下条目:

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
  5. ......等等,这将导致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脚本。因此,更好的解决方案是创建一个upstart服务。有一些合理的入门文档here

答案 1 :(得分:1)

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

String value = Console.ReadLine();
int number1;

switch (value)
{
    case "ATX": number1 =  3; break;
    case "XTS": number1 = 34; break;
    case "CTS": number1 =  2; break;
    default:    number1 =  0; break;
}

Console.WriteLine(number1);

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