啟動一些程序服務的時候,有時候直接去程序的bin目錄下去執行命令,有時候利用service啟動。
比如啟動mysql服務時,大部分喜歡執行service mysqld start。當然也可以去mysql下執行bin命令帶上幾個參數什么的。
那么service是啥呢?linux可以man一下,看出來就是去/etc/init.d下執行了可執行的shell腳本。
service執行的服務腳本都是在/etc/init.d目錄下,各個程序下腳本里執行的命令仍然是在各個bin下。
這樣我們也可以在這個目錄下寫一個shell,模仿這些程序來個。
先寫一個簡單到爆炸的service啟動腳本。
# cd /etc/init.d
# vi haha #這個腳本名字叫haha
#!/bin/sh echo '$0='$0 '$1='$1 start(){ echo 'ls' cd ~ && ls } stop(){ echo 'll' cd ~ && ls -l } case "$1" in "start") start ;; "stop") stop ;; esac
給這個腳本的執行權限比如 # chmod +x haha
執行這個:
# service haha start
# service haha stop
可以看到腳本里輸出了一下$0,$1
$0=/etc/init.d/haha
$1=start 或者 stop,就是haha腳本的參數
然后start和stop執行了非常簡單的命令~
例子就是這樣,其他的腳本無非就是去執行了它自己命令包的命令
有時間可以分析下php-fpm的service命令方式的腳本:
#! /bin/sh # # chkconfig: - 84 16 # description: PHP FastCGI Process Manager # processname: php-fpm # config: /etc/php-fpm.conf # config: /etc/sysconfig/php-fpm # pidfile: /var/run/php-fpm/php-fpm.pid # ### BEGIN INIT INFO # Provides: php-fpm # Required-Start: $local_fs $remote_fs $network $named # Required-Stop: $local_fs $remote_fs $network # Short-Description: start and stop PHP FPM # Description: PHP FastCGI Process Manager ### END INIT INFO # Standard LSB functions #. /lib/lsb/init-functions # Source function library. . /etc/init.d/functions #圓點.表示引入這個文件。 加載函數庫文件,比如下面的daemon,killproc,status都是這個文件里的 # Check that networking is up. . /etc/sysconfig/network #加載網卡情況文件, 比如下面的"$NETWORKING" = "no" # Additional environment file if [ -f /etc/sysconfig/php-fpm ]; then #加載這個文件,是否有額外的配置信息 . /etc/sysconfig/php-fpm fi if [ "$NETWORKING" = "no" ] then exit 0 fi RETVAL=0 #返回值 初始化 prog="php-fpm" #程序名稱 pidfile=${PIDFILE-/var/run/php-fpm/php-fpm.pid} # $(a-b)這種表達方式表示,如果a存在,那么就返回$a,否則就返回$b。PIDFILE就表示可能是上面加載文件/etc/sysconfig/php-fpm里的變量。 -- pidfile,存放一個進程號pid lockfile=${LOCKFILE-/var/lock/subsys/php-fpm} start () { echo -n $"Starting $prog: " # echo -n -n表示不換行 dir=$(dirname ${pidfile}) [ -d $dir ] || mkdir $dir # 不存在pid文件的目錄則創建 daemon --pidfile ${pidfile} /usr/sbin/php-fpm --daemonize #執行php-fpm命令,這個最重要的 RETVAL=$? #獲取上一條命令的執行返回值 echo #表示換行 [ $RETVAL -eq 0 ] && touch ${lockfile} # 如果啟動成功,生成一個lockfile文件 } stop () { echo -n $"Stopping $prog: " killproc -p ${pidfile} php-fpm # 停掉程序 killproc的函數就在文件頭處引入的/etc/init.d/functions文件 RETVAL=$? echo if [ $RETVAL -eq 0 ] ; then rm -f ${lockfile} ${pidfile} fi } restart () { stop start } reload () { echo -n $"Reloading $prog: " if ! /usr/sbin/php-fpm --test ; then RETVAL=6 echo $"not reloading due to configuration syntax error" failure $"not reloading $prog due to configuration syntax error" else killproc -p ${pidfile} php-fpm -USR2 # 這里關鍵的是信號USR2,這個信號告訴是平滑重載所有worker進程並重新載入配置和二進制模塊;這就是reload和restart的區別 RETVAL=$? fi echo } # See how we were called. case "$1" in start) start ;; stop) stop ;; status) status -p ${pidfile} php-fpm RETVAL=$? ;; restart) restart ;; reload|force-reload) reload ;; configtest) /usr/sbin/php-fpm --test RETVAL=$? ;; condrestart|try-restart) [ -f ${lockfile} ] && restart || : ;; *) echo $"Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart|try-restart|configtest}" RETVAL=2 ;; esac exit $RETVAL