1 概述

/etc/init.d/functions这个这个系统自带的函数库在/etc/init.d里,很多脚本执行的时候会调用这里的函数。

这个文件首先会设置umask,path,还有语言环境等,然后会设置success,failure,warning,normal四种情况下的字体颜色。

该文件共定义了33个函数

本文将针对CentOS6S上的一些函数的用法进行介绍

2 函数介绍

daemon

启动某个服务。这里的服务名 都是放置/etc/init.d路径下的启动脚本的文件名,如ntpd

函数的$1为服务名

默认用法 函数  服务名

如:daemon  ntpd

函数的$1如果不是服务名,可以有其他的选项,如下

进程服务名放置第4个位置参数$3位,$2可以任意参数

--check,--user,  --pidfile

如:daemon --check start ntpd

进程服务名放置第3个位置参数$2位:

--check=?*,--user=?*,--pidfile=?*,--force,[-+][0-9]*

daemon --check=ntpd ntpd

killproc

杀死某个进程。和 daemon相反的作用

这里$1是服务名,则是放置/etc/init.d路径下的启动脚本的文件名,如ntpd

用法  函数名 服务名

如 killproc ntpd

这里$1不是服务名,为其他参数,如-p,$2是放在在/var/run/服务名.pid的这类文件

用法 killproc -p  pid_file

如  killproc -p /var/run/ntpd.pid

status

返回一个服务的状态,

$1如果是服务名,用法如下

用法 函数 服务名

如 status  ntpd  结果为 ntpd (pid 23767) is running...的提示

如果$1不是函数名,如-p或-l,用法如下

$1=-p,pid_file=$2    $2是文件:/var/run/服务名.pid

$1=-l,lock_file=$2 ,$2是/var/lock/subsys下的文件名

$3为进程名

用法 status $1 $2 $3

如 status -l /var/lock/subsys/atd.pid atd

或 status -p /var/run/atd.pid atd

action

打印$1,然后向左移动一位后,将所有的参数($@)作为一个命令来执行

$@组成的这个命令的返回值如果为真,就打印 $1  [ok],这里的$1是原来的$1

$@组成的这个命令的返回值如果为假,就打印 $1  [FAILED],这里的$1是原来的$1

如ntpd这个指定本身会启动ntp服务,本身执行这个命令就是会成功开启ntpd服务,所有当执行

action start ntpd

这个命令$@就是 ntpd,显示为如下,可以正确表达了意思

start            [OK]

如果移动位置后的$@不是一个命令,那么就是会显示失败

所有用action这个函数,要知道当$1被移动位置后的$@执行的结果,再指定$1的内容,这样才能正确表示意思

执行如下语句,service ntpd stop&>/dev/null本身是一条完整的停止服务的命令

这里$1是stop ntpd,把$1移动位置后,$@是service ntpd stop&>/dev/null,这是一条完整的命令

action "stop ntpd"  `service ntpd stop&>/dev/null`

执行结果如下,命令执行后就可以正确命令执行的结果

stop ntpd                      [  OK  ]

checkpid 

验证pid对应的服务是否存在,检查路径/proc下是否已存在pid,如果有一个存在,函数返回值是0,否则函数返回值是1

用法 函数 pid(这里的pid是数字,代表/proc目录下的某个进程文件名称,也是进程号)

如 checkpid  1

__pids_var_run 

查看某个服务名是否存在,存在返回状态码0,不存在返回1,3或4

如果$1是进程的服务名

用法  __pids_var_run $1

如  __pids_var_run  atd  进程存在,返回状态码0,这里会把进程号赋值给pid这个变量,但是不打印出来

如果$1不是进程的服务名,就检查$2,$2是放在/var/run/服务名.pid

用法  __pids_var_run $1 /var/run/服务名.pid

如  __pids_var_run  -a  /var/run/atd.pid  进程存在,返回状态码0

pidfileofproc

寻找进程服务名的pid,因为调用了__pids_var_run $1用法,所以仅仅通过pid_file来查找进程id

用法 pidfileofproc  服务名

如  pidfileofproc  atd  ,结果显示pid的进程id

__pids_pidof

通过pidof命令查看进程id

用法 __pids_pidof  服务名

如 __pids_pidof  atd 结果会显示进程id

pidofproc

调用了两个函数来查找进程id,如果要查看服务的进程id,建议用这个脚本来查看更详细

__pids_var_run和__pids_pidof两个函数

用法 pidofproc  进程名

如  pidofproc atd

echo_success,echo_failure,echo_passed,echo_warning

分别输出各类信息,

如成功绿色OK,失败红色FAILED,通过蓝色PASSED,警告×××WARNING

用法 直接运行函数

如 echo_success

__readlink 

将函数后面的每个参数用一行读出,如果参数不存在,则忽略该参数

用法  __readlink $1 $2 $3 ...

如 __readlink  aa aa.bak test.sh 如果这三个参数文件存在,就一行行显示,不存在就直接忽略

strstr

判断$1是否含有$2,如果$1含有$2,那么返回值$?为0,否则为1

用法 strstr $1 $2

如  strstr  abcd bc ,结果为真,返回0

strstr  abxcd bc ,结果为假,返回1

confirm 

确认是否真的要运行此服务,如果是y|Y就返回0,C返回2,n|N返回1,我们可以判断返回值来确定是否要进行下一步

用法 confirm

显示 "Start service $1 (Y)es/(N)o/(C)ontinue? [Y]"的提示信息,输入y,Y,n,N,C等

is_ignored_file :检查文件$ 1是备份还是rpm生成的文件,并且应该被忽略

用法 is_ignored_file $1 如果是要被忽略的,就返回0.否则返回1

get_numeric_dev 

将设备转换为用10进制或者16进制的格式的数值现在,格式为major:minor

$1可以指定为 指定为fmt或者hex,fmt为10进制,hex为16进制,$2为设备,如/dev/sda

用法 get_numeric_dev $1 $2

如  get_numeric_dev hex /dev/sr0

get_numeric_dev dev /dev/sr0

is_true 

判断函数的$1是否为 [tT] | [yY] | [yY][eE][sS] | [tT][rR][uU][eE] 是的话,返回值为0,否则返回值为1

用法  is_true $1

如  is_true  y 结果返回值为0

is_false

 判断函数的$1是否为 [fF] | [nN] | [nN][oO] | [fF][aA][lL][sS][eE] 是的话,返回值为0,否则返回值为1

用法  is_false $1

如  is_false  n 结果返回值为0

3 小结

以上只是函数库的一部分,函数在运行的过程可以互相调用。更详细的函数用法,请参考系统文件/etc/init.d/functions