/etc/init.d/functions 公共函数

最后更新于:2022-04-02 03:47:33

[TOC] > [参考](https://shellscript.readthedocs.io/zh_CN/latest/2-library/2-commonfunc/index.html) ## 概述 `/etc/init.d/functions` 中的常用函数 **颜色函数** - success:显示绿色的OK,表示成功 - failure:显示红色的FAILED,表示失败 - passed:显示黄色的PASSED,表示pass该任务 - warning:显示黄色的warning,表示警告 **显示函数** - is_true:$1的布尔值代表为真时,返回状态码0,否则返回1;包括t/y/yes/true,不区分大小写 - is_false:$1的布尔值代表为假时,返回状态码0,否则返回1;包括f/n/no/false,不区分大小写 - action:根据进程退出状态码自行判断是执行success还是failure **进程函数** - checkpid:检查/proc下是否有给定pid对应的目录,给定多个pid时,只要存在一个目录都返回状态码0 - __pids_var_run:检查pid是否存在,并保存到变量pid中,同时返回几种进程状态码 - __pids_pidof:获取进程pid - pidfileofproc:获取进程pid,但只能获取/var/run下的pid文件中的值 - pidofproc:获取进程pid,可获取任意给定pidfile或默认/var/run下pidfile中的值 - status:检查给定进程的运行状态 **程序控制** - daemon:启动一个服务程序,启动前还检查进程是否已在运行 - killproc:杀掉给定的服务进程 ## 显示函数 ### success demo.sh ``` #!/bin/bash . /etc/init.d/functions success echo "启动" ``` 输出 ![](blob:https://www.kancloud.cn/cb4b160b-058a-4101-94d4-08241ea71e36) ### is_true ``` > is_true t > echo $? 0 > is_true n > echo $? 1 ``` ### action 实用 退出状态码自动判断是执行success还是执行failure函数 1. 当只有一个参数直接打印 2. 当大于一个参数时,从第二个参数开始执行 先将第一个参数保存并踢掉,再执行后面的命令("$@"表示执行后面的命令) 当action函数只有一个参数时,action直接返回OK,状态码为0;当超过一个参数时,第一个参数先被打印,再执行从第二个参数开始的命令 实例 ``` #!/bin/bash . /etc/init.d/functions action "启动" action "启动" /bin/false action "启动" sleep 5 ``` 输出 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/57/f6/57f6d9db0798993d7d331e149147b89e_499x45.png) ## 进程函数 ### checkpid 查看 pid 是否正常运行 检查 `/proc`下是否存在pid ``` #!/bin/bash . /etc/init.d/functions # 单个 checkpid 23 echo $? # 多个 checkpid 23 24 echo $? # 不存在的 checkpid 83230 echo $? ``` 输出 ``` 0 0 1 ``` ### __pids_var_run 判断程序运行状态 格式 :`__pids_var_run program [pidfile] ` 如果不指定 pidfile ,则默认查找 `/var/run/程序名.pid` 返回状态 * `0`:表示`program`正在运行 * `1`:表示`program`进程已死,`pid文件`存在,但`/proc`目录下没有对应的文件 * `3`:表示pid文件不存在 * `4`:表示pid文件的权限错误,不可读 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/d2/ea/d2ea6fd7ac6f10521893ee3552ffaeaf_518x208.png) ### daemon 启动程序返回结果 格式: ``` daemon [--check=servicename] [--user=USER] [--pidfile=PIDFILE] [--force] program [prog_args] -p pidfile:用于指定从此文件中获取进程的pid号,不指定时默认从/var/run/$base.pid中获取 -d delay:指定未使用-signal时的延迟检测时间;有效单位为秒、分、时、日("smhd"),不写时默认为秒 -signal:用于指定kill发送的信号;如果不指定,则默认先发送TERM信号,在-d delay时间段内仍不断检测是否进程已经被杀死,如果还未死透,则delay超时后发送KILL信号强制杀死 ``` 这个"--pidfile"是写在"$httpd"前面的,表示这是daemon的参数,而非"$httpd"的启动参数 ``` echo -n $"Starting $prog: " daemon --pidfile=${pidfile} $httpd $OPTIONS ``` ``` [root@xuexi ~]# /etc/init.d/httpd start Starting httpd: [ OK ] ``` ### killproc 杀进程 格式: `killproc [-p pidfile] [ -d delay] {program} [-signal] ` 需要再三确定`pid文件`是否存在,`/proc`下是否有和`pid`对应的目录。直到`/proc`下已经没有了和`pid`对应的目录时,才表示进程真正杀死了 ``` . /etc/init.d/functions killproc httpd ``` 输出 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/da/35/da357c61de06c567a79c927639440deb_504x47.png) ### status 提示 ``` ${base} (pid $pid) is running... ${base} dead but pid file exists ${base} status unknown due to insufficient privileges ${base} dead but subsys locked ${base} is stopped ``` 实例 ``` > . /etc/init.d/functions > status httpd httpd (pid 27649) already running > apachectl stop > status httpd httpd is stopped ```
';