用inittab实现进程异常退出则自动重启

kevin.Zhu 发布于:2013-1-16 11:52 分类:Linux  有 18 人浏览,获得评论 0 条  

写了个脚本,需要跑一个服务器,但是这个业务比较关键,不能down掉。怎么办呢?写一个daemon监视pid是否存在不存在则exec?daemon本身挂掉了怎么办?双进程互相监视?

无意中查到了一个Linux现有机制可以很好的完成这个问题;inittab

使用很简单,编辑 /etc/inittab 文件在最后一行写自己的东西就行了。语法可以照抄,格式为:

id:runlevels:action:进程名

修改之后保存,运行 telinit q  # 让系统重新读取/etc/inittab

注: runlevel # 显示系统当前的运行级别

telinit # 改变系统当前的运行级别


---------------------------------

id是不能重复的一个唯一标志

runlevel 就是进程运行级别。0是halt,1是单用户模式,6是重启。一般的程序在普通模式下的runlevel都是 2到5。Debian一般是2。可以参考wikipedia上的定义

运行级就是操作系统当前正在运行的功能级别。这个级别从1到6,具备不同的功能。其功能级别如下:
# 0 - 停机(千万不能把initdefault 配置为0 )
# 1 - 单用户模式 
# 2 - 多用户,没有 NFS 
# 3 - 完全多用户模式(标准的运行级) 
# 4 - 没有用到 
# 5 - X11 (xwindow) 
# 6 - 重新启动 (千万不要把initdefault 配置为6——把被您黑掉的linux的initdefault配置为0或6也算是拒绝服务攻击噢!)



action 就是采取的动作。分下面这么几种:

有效的action值如下:
respawn:表示init应该监控这个进程,即使其结束后也应该被重新启动。
wait: init应该运行这个进程一次,并等待其结束后再进行下一步操作。
once: init需要运行这个进程一次。
boot: 随系统启动运行,所以runlevel值对其无效。
bootwait:随系统启动运行,并且init应该等待其结束。
off: 没有任何意义。
initdefault:系统启动后的默认运行级别;由于进入相应的运行级别会激活对应级别的进程,所以对其指定process字段没有任何意义。假如inittab文档内不存在这一条记录,系统启动时在控制台上询问进入的运行级。
sysinit: 系统启动时准备运行的命令。比如说,这个命令将清除/tmp。能够查看/etc/rc.d/rc.sysinit脚本了解其运行了那些操作。
powerwait:允许init在电源被切断时,关闭系统。当然前提是有U P S和监控U P S并通知init电源已被切断的软件。RH linux默认没有列出该选项。
powerfail: 同powerwait,但init不会等待正在运行的进程结束。RH linux默认没有列出该选项。
powerokwait:当电源监控软件报告“电源恢复”时,init要执行的操作。
powerfailnow:检测到ups电源即将耗尽时,init要执行的操作,和powerwait/powerfail不同的哟。
ctrlaltdel:允许init在用户于控制台键盘上按下C t r l A l t D e l组合键时,重新启动系统。注意,假如该系统放在一个公共场所,系统管理员可将C t r l A l t D e l组合键配置为别的行为,比如忽略等。我是配置成打印一句骂人的话了^o^。
kbrequest:监控到特定的键盘组合键被按下时采取的动作,现在还不完善。
ondemand:A process marked with an ondemand runlevel will be executed whenever the specified ondemand runlevel is called. However, no runlevel change will occur (ondemand runlevels are ‘a’, ‘b’,and ‘c’),(英语太菜,那个however不知道该怎么翻译才好。惭愧!)