当前位置: 技术问答>linux和unix
关于进程终止状态的问题!
来源: 互联网 发布时间:2016-02-05
本文导语: 在编写符合LSB规范的shell脚本时,要实现检查进程终止状态的功能。 突然发现/etc/rc.d/init.d/functions中的status()函数“依次”检查了进程的四种状态,查了些资料发现对这四种状态的解释为: # Status has a slightly differen...
在编写符合LSB规范的shell脚本时,要实现检查进程终止状态的功能。
突然发现/etc/rc.d/init.d/functions中的status()函数“依次”检查了进程的四种状态,查了些资料发现对这四种状态的解释为:
# Status has a slightly different for the status command:
# 0 - service running
# 1 - service dead, but /var/run/ pid file exists
# 2 - service dead, but /var/lock/ lock file exists
# 3 - service not running
我不明白第1和2种状态是什么意思,什么情况下会产生这中状态,产生这些状态意味着什么呢?这些和僵尸进程有关系吗?
还有一个问题:
有什么好办法判断一个服务没死,但停止对外服务了?
突然发现/etc/rc.d/init.d/functions中的status()函数“依次”检查了进程的四种状态,查了些资料发现对这四种状态的解释为:
# Status has a slightly different for the status command:
# 0 - service running
# 1 - service dead, but /var/run/ pid file exists
# 2 - service dead, but /var/lock/ lock file exists
# 3 - service not running
我不明白第1和2种状态是什么意思,什么情况下会产生这中状态,产生这些状态意味着什么呢?这些和僵尸进程有关系吗?
还有一个问题:
有什么好办法判断一个服务没死,但停止对外服务了?
|
1和2可能是进程被挂起,不再响应了。
1 的情况是为了保证进程只有一个实例,在启动的时候把进程的PID写到/var/run/pid_file里,
下次再启动的时候去读这个文件取得一个PID,然后与本进程PID比较,如果一样那么把它杀死,
或者自己退出。
2 的情况是进程使用了锁文件,这个时候进程可能进入了死锁状态,要由其它进程来kill掉。
1 的情况是为了保证进程只有一个实例,在启动的时候把进程的PID写到/var/run/pid_file里,
下次再启动的时候去读这个文件取得一个PID,然后与本进程PID比较,如果一样那么把它杀死,
或者自己退出。
2 的情况是进程使用了锁文件,这个时候进程可能进入了死锁状态,要由其它进程来kill掉。
|
1. linux系统下的守护进程在结束后还是会保存该pid文件. 由于守护进程大多是服务程序, 拥有比较特殊的pid, 当重启守护进程时, 检查该pid文件, 并杀死pid文件中记录的pid进程, 实现重启.
2. 获得锁的情况下异常退出, 没有回收锁. 比如Ubuntu下的apt-get就会经常性的造成这种现象, 可能是程序的bug吧.
2. 获得锁的情况下异常退出, 没有回收锁. 比如Ubuntu下的apt-get就会经常性的造成这种现象, 可能是程序的bug吧.
|
判断一个服务没死,但是停止对外服务了,这个要根据具体服务来定。
比如数据库可以采用检查进程在不在,然后连接,查询的方法。
对数据库执行一个select语句,看看是否有返回,如果有返回,说明服务正常对外服务,如果无,
那么说明服务停止对外服务了。但是这里也有一个问题,有的数据库对查询结果执行了缓冲,
你的select语句返回值有可能是从缓冲区返回的,而这时数据库已经停止对外服务了。
更好的一个方法是,在数据库里建一个特殊表,取你的系统当前时间,然后把这个时间insert到数据
库里,再把它给读出来,最后用读出来的时间与你前面取到的时间相比,如果一样,证明数据库
正常对外提供服务,如果不一样,这时问题就大了,说明数据库挂了。
比如数据库可以采用检查进程在不在,然后连接,查询的方法。
对数据库执行一个select语句,看看是否有返回,如果有返回,说明服务正常对外服务,如果无,
那么说明服务停止对外服务了。但是这里也有一个问题,有的数据库对查询结果执行了缓冲,
你的select语句返回值有可能是从缓冲区返回的,而这时数据库已经停止对外服务了。
更好的一个方法是,在数据库里建一个特殊表,取你的系统当前时间,然后把这个时间insert到数据
库里,再把它给读出来,最后用读出来的时间与你前面取到的时间相比,如果一样,证明数据库
正常对外提供服务,如果不一样,这时问题就大了,说明数据库挂了。
|
帮顶