functions文件详细分析和说明(3)

第二个函数confirm的作用是根据交互式输入的值返回不同的状态码,如果输入的是y或Y或不输入时,返回0。输入的是c或C时,返回状态码2,输入的是n或N时返回状态码1。

于是可以根据confirm的状态值决定是否要继续执行某个程序。

用法和效果如下:

[root@xuexi ~]# confirm Start service (Y)es/(N)o/(C)ontinue? [Y] Y [root@xuexi ~]# echo $? 0 [root@xuexi ~]# confirm Start service (Y)es/(N)o/(C)ontinue? [Y] [root@xuexi ~]# echo $? 0 [root@xuexi ~]# confirm Start service (Y)es/(N)o/(C)ontinue? [Y] n [root@xuexi ~]# echo $? 1 [root@xuexi ~]# confirm Start service (Y)es/(N)o/(C)ontinue? [Y] c [root@xuexi ~]# echo $? 2 5.pid检测相关函数

启动进程时,pid文件非常重要。不仅可以通过它判断进程是否在运行,还可以从中读取pid号用来杀进程。

5.1 checkpid、__pids_var_run和__pids_pidof函数

pid文件的路径可能为/var/run/$base.pid文件($base表示进程名的basename),也可能是自定义的路径,例如mysql的pid可以自定义为/mysql/data/mysql01.pid。但无论哪种情况,functions中的__pids_var_run函数都可以处理。

pid文件中可能有多行,表示多实例。

每个进程都必有一个pid,但并不一定都记录在pid文件中,例如线程的pid。但无论如何,在/proc/目录下,一定会有pid号命名的目录,只要有对应pid号的目录,就表示该进程已经在运行。函数checkpid专门检测给定的pid值在/proc下是否有对应的目录存在。

为了获取进程名的pid值,此处函数__pids_pidof使用的是pidof命令。该命令专门设计用来在脚本中取给定进程的pid。它的"-o"选项用于忽略某些进程号,在脚本中应用时常被忽略的是调用pidof的shell的PID,当前shell的PID以及父shell的pid。总之,该函数的目的就是为了获取合理无误的进程pid。

以下是函数checkpid、__pids_var_run和__pids_pidof的定义语句。

# Check if any of $pid (could be plural) are running checkpid() { local i for i in $* ; do # 检测/proc目录下是否存在给定的进程目录 [ -d "/proc/$i" ] && return 0 done return 1 } # __proc_pids {program} [pidfile] # Set $pid to pids from /var/run* for {program}. $pid should be declared # local in the caller. # Returns LSB exit code for the 'status' action. __pids_var_run() { # 通过检测pid判断程序是否已在运行 local base=${1##*/} # 获取进程名的basename local pid_file=${2:-/var/run/$base.pid} # 定义pid文件路径 pid= if [ -f "$pid_file" ] ; then # 给定的pid文件是否存在 local line p [ ! -r "$pid_file" ] && return 4 # "user had insufficient privilege" while : ; do # 将pid文件中的pid值(可能有多行)赋值给pid变量 read line [ -z "$line" ] && break for p in $line ; do [ -z "${p//[0-9]/}" ] && [ -d "/proc/$p" ] && pid="$pid $p" done done < "$pid_file" if [ -n "$pid" ]; then # pid存在,则返回0。否则表示pid文件存在,但/proc下没有对应命令 return 0 # 即进程已死,但pid文件却存在,返回状态码1。 fi return 1 # "Program is dead and /var/run pid file exists" fi return 3 # "Program is not running" # pid文件不存在时,表示进程未运行,返回状态码3 } # Output PIDs of matching processes, found using pidof __pids_pidof() { # 下面的pidof命令的意义见稍后解释 pidof -c -m -o $$ -o $PPID -o %PPID -x "$1" || \ # 忽略当前shell的PID,父shell的pid和 # 调用pidof程序的shell的pid pidof -c -m -o $$ -o $PPID -o %PPID -x "${1##*/}" # 总之就是找出合理的pid }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/13446.html