请选择 进入手机版 | 继续访问电脑版
查看: 77|回复: 1

[工作经验] 基于pid相关的用法解析

[复制链接]

签到天数: 193 天

[LV.7]化身百千

发表于 2019-2-27 19:36:18 | 显示全部楼层 |阅读模式

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。

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /2 下一条

返回顶部