从__pidsvar_run函数的定义语句中可以了解到,只有当pid文件存在,且/proc下有pid对应的目录时,才表示进程在运行(当然,线程没有pid文件)。__pids_var_run函数调用方法:
__pids_var_run program [pidfile]如果不给定pidfile,则默认为/var/run/$base.pid文件。函数的执行结果为4种状态码:
0:program正在运行。
1:program进程已死。pid文件存在,但/proc目录下没有对应的文件。
3:pid文件不存在。
4:pid文件的权限错误,不可读。
除了返回状态码,__pids_var_run函数还会保存变量pid的结果,以供其他程序引用。
__pids_pidof中使用了pidof命令,其中使用了几个"-o"选项,它用于忽略指定的pid。但看上去"$$""$PPID""%PPID"不是很好理解。"-o $$"是忽略的是shell进程,大多数时候它会继承父shell的pid,但在脚本中时它代表的是脚本所在shell的pid。"-o $PPID"忽略的是父shell。"-o %PPID"忽略的是调用pidof命令的shell。不是很好理解,可以参考下面的测试语句。
测试脚本:
#!/bin/bash echo 'pidof bash: '`pidof bash` echo 'script shell pid: '`echo $$` echo 'script parent shell pid: '`echo $PPID` echo 'pidof -o $$ bash: '`pidof -o $$ bash` echo 'pidof -o $PPID bash: '`pidof -o $PPID bash` echo 'pidof -o %PPID bash: '`pidof -o %PPID bash` echo 'pidof -o $$ -o $PPID -o %PPID bash: '`pidof -o $$ -o $PPID -o %PPID bash`测试语句:
[root@xuexi ~]# pidof bash 3306 2436 2302 [root@xuexi ~]# (echo 'parent shell: '$$;echo "current bash pid: `pidof bash`";./test.sh)|cat -n 1 parent shell: 2302 2 current bash pid: 3745 3306 2436 2302 3 pidof bash: 3748 3745 3306 2436 2302 4 script shell pid: 3748 5 script parent shell pid: 3745 6 pidof -o $$ bash: 3745 3306 2436 2302 7 pidof -o $PPID bash: 3748 3306 2436 2302 8 pidof -o %PPID bash: 3745 3306 2436 2302 9 pidof -o $$ -o $PPID -o %PPID bash: 3306 2436 2302第一个pidof命令:说明当前已有3个bash,pid为:3306、2436和2302。
第二个命令:
行1说明括号的父shell为2302。
行5说明脚本的父shell为3745。即括号的父shell为当前bash环境,脚本的父shell为括号所在shell。
行2减第一个命令的结果说明括号所在子shell的pid为3745。
行3减行2说明shell脚本所在子shell的pid为3748。
"-o $$"忽略的是当前shell,即脚本所在shell的pid,因为在shell脚本中时,$$不继承父shell的pid。
"-o $PPID"忽略的是pidof所在父shell,即括号所在shell。
"-o %PPID"忽略的是调用调用pidof程序所在的shell,即脚本所在shell。
5.2 pidfileofproc和pidofproc函数除了以上3个pid相关函数,functions文件中,还提供了两个函数pidfileofproc和pidofproc,均用于获取给定程序的pid值。
以下是pidfileofproc函数的定义语句。注意,该函数不是获取pidfile,而是获取pid值。
# A function to find the pid of a program. Looks *only* at the pidfile pidfileofproc() { local pid # Test syntax. if [ "$#" = 0 ] ; then echo $"Usage: pidfileofproc {program}" return 1 fi __pids_var_run "$1" # 不提供pidfile,因此认为是/var/run/$base.pid [ -n "$pid" ] && echo $pid return 0 }因此,pidfileofproc函数只能获取/var/run下的pid。