/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
```
';