pid相关
checkpid:检查/proc下是否有给定pid对应的目录,无论给定多少个pid,只要有一个有目录,都返回0。
调用方法:checkpid pid_list
[root@xuexi ~]# source /etc/init.d/functions
[root@xuexi ~]# sleep 10 & a="$!";sleep 10 & a="$a $!";sleep 10 & a="$a $!";checkpid $a
[root@xuexi ~]# echo $?
0
__pids_var_run:检查pid是否存在,并保存到变量pid中,同时返回几种进程状态码。
这个函数非常重要,不仅从pidfile中获取并保存pid号码,还根据情况返回几种状态码,这几个状态码是status函数的重要依据。在SysV服务启动脚本中使用非常广泛。
调用方法:__pids_var_run program [pidfile]
以下是httpd进程的测试结果。分别是指定pid文件和不指定pid文件的情况。
[root@xuexi ~]# service httpd start
[root@xuexi ~]# __pids_var_run httpd /var/run/httpd/httpd.pid
[root@xuexi ~]# echo $?
0
[root@xuexi ~]# echo $pid
4863
[root@xuexi ~]# __pids_var_run httpd # 不指定pidfile时,将搜索/var/run/httpd.pid
[root@xuexi ~]# echo $?
3
[root@xuexi ~]# echo $pid # 每次调用该函数Pid会重置
[root@xuexi ~]#
__pids_pidof:获取进程pid。
pidfileofproc:获取进程的pid。但只能获取/var/run下的pid文件中的值。
pidofproc:获取进程的pid。可获取任意给定pidfile或默认/var/run下pidfile中的值。
都是获取进程pid,第一个函数和后两个的区别主要在于获取的pid是bash进程时更精确,第二个和第三个函数的区别在于第2个函数只能获取/var/run下pid文件中的pid值。
[root@xuexi ~]# service httpd restart
[root@xuexi ~]# pidfileofproc httpd
[root@xuexi ~]# pidofproc httpd
4872 4871 4870 4869 4868 4867 4866 4865 4863
[root@xuexi ~]# __pids_pidof httpd
4872 4871 4870 4869 4868 4867 4866 4865 4863
上面pidfileofproc命令没有任何结果,因为httpd的pid文件为/var/run/httpd/httpd.pid,而非/var/run/httpd.pid。
如果将httpd的pid路径修改为/var/run/httpd.pid,再看它们的结果。
[root@xuexi ~]# service httpd stop
[root@xuexi ~]# sed -i "s%^PidFile.*%PidFile /var/run/httpd.pid%" /etc/httpd/conf/httpd.conf
[root@xuexi ~]# sed -i 's%^#PIDFILE.*%PIDFILE=/var/run/httpd.pid%' /etc/sysconfig/httpd
[root@xuexi ~]# service httpd start
[root@xuexi ~]# ls /var/run/httpd*
/var/run/httpd.pid
/var/run/httpd:
再看它们搜索到的pid以及进程列表中httpd的pid和pid文件中的pid。
[root@xuexi ~]# __pids_pidof httpd
6235 6234 6233 6232 6231 6230 6229 6228 6226
[root@xuexi ~]# pidofproc httpd
6226
[root@xuexi ~]# pidfileofproc httpd
6226
[root@xuexi ~]# ps aux | grep http[d]
root 6226 0.0 0.3 177844 3892 ? Ss 12:14 0:00 /usr/sbin/httpd
apache 6228 0.0 0.2 177844 2532 ? S 12:14 0:00 /usr/sbin/httpd
apache 6229 0.0 0.2 177844 2508 ? S 12:14 0:00 /usr/sbin/httpd
apache 6230 0.0 0.2 177844 2508 ? S 12:14 0:00 /usr/sbin/httpd
apache 6231 0.0 0.2 177844 2508 ? S 12:14 0:00 /usr/sbin/httpd
apache 6232 0.0 0.2 177844 2508 ? S 12:14 0:00 /usr/sbin/httpd
apache 6233 0.0 0.2 177844 2508 ? S 12:14 0:00 /usr/sbin/httpd
apache 6234 0.0 0.2 177844 2508 ? S 12:14 0:00 /usr/sbin/httpd
apache 6235 0.0 0.2 177844 2508 ? S 12:14 0:00 /usr/sbin/httpd
[root@xuexi ~]# cat /var/run/httpd.pid
6226
所以,要使用这3个函数中的哪一个?如果要找出进程的”master”进程号,例如要向主进程发送HUP信号reload配置文件时,应该用pidofproc并使用”-p”指定pid文件。其余时候用__pids_pidof准没错,也正是如此,在daemon和killproc函数中都使用了它。另外,在多实例的情况下,也可以考虑使用pidofproc来根据pidfile搜索对应实例的pid。
|