编写脚本之前有几个东西要知道:

  现在用的包的安装是靠rpm来装的,rpm装的时候所有东西都做好了,包括脚本都已经给定了,直接用就行了。但是我们还应该清楚一点,在实际的工作中,为了用到更新的软件更新的功能,必须靠源代码来实现。源代码安装的好处是可以利用最新的版本,最新的功能。但是,它最不好的地方在于很多东西都需要自己动手,比如控制脚本都要自己来完成,一般没有提供。没有这些脚本是不能用service命令来控制服务的。一旦有了脚本管理服务就很容易了。

  1、服务安装完之后会形成一个可执行文件,这个可执行文件在/usr/sbin目录下(额外安装的服务的可执行程序都会放在这个目录下)

  2、一个服务一旦执行之后,将会形成一个锁文件。这个锁文件在/var/lock/subsys/目录下。基于这个锁可以做一些判断,如果锁存在说明服务正在运行,如果所不存在说明服务没有在运行。

  3、httpd服务启动时的pid文件在/var/run/httpd.pid中保存着。

  4、pkill在针对Apache来处理没有问题,但针对一些其他服务进程来处理的时候,这种方式可能处理不了。比较常用、可靠的一种方式是:killproc

  接下来演示一个httpd的控制脚本。

[root@localhost ~]# vim http2.sh
#!/bin/bash
prog=/usr/sbin/httpd
lockfile=/var/lock/subsys/httpd
pidfile=/var/run/httpd.pid
. /etc/init.d/functions

start() {
if [ -e $lockfile ];then
echo "the program `basename $prog` is started....."
else
echo -e -n "the program `basename $prog` is starting....."
sleep 2
$prog && echo "[ OK ]" && touch $lockfile || echo "fail"
fi
}

stop() {
if [ -e $lockfile ];then
echo -e -n "the program `basename $prog` is stopping...."
sleep 2
killproc `basename $prog` && rm -rf $lockfile && echo "[ OK ]" || echo "fail"
else
echo -e "the program `basename $prog` is stopped"
fi
}

status() {
if [ -e $pidfile ];then
echo "the program `basename $prog` `cat $pidfile` is running"
else
echo -e "the program `basename $prog` is stopped"
fi
}

case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
restart)
stop
start
;;
*)
echo "USAGE:start|stop|satus|restart"
esac

测试情况如下: