Total Pageviews

Friday, 17 February 2012

Linux vps下,创建一个最简单的随机启动服务

像mysql,apache等服务能够使用service命令或者调 用init.d下的脚本启动、关闭或者重启进程。例如,
service mysql restart
service apache2 stop
或者
/etc/init.d/mysql restart
/etc/init.d/apache2 stop
因为不同的Linux发行版本,对后台服务的处理方式不大一样,所以下面以Ubuntu系统为例,看看如何写一个简单的随机启动服务。
准备好一个需要随机启动的程序,例如/root/proxy.py,设置可执行属性,确保可以通过输入绝对路径直接执行。
root@localhost:~# chmod +x proxy.py
root@localhost:~# /root/proxy.py
编写一个启动控制脚本,以proxy为例,建立/etc/init.d/proxy文本文件,输入下面的内容:
#!/bin/sh
case "$1" in
start)
start-stop-daemon --start --background --exec /root/proxy.py
;;
stop)
start-stop-daemon --stop --name proxy.py
esac
这是一个简单的shell脚本,case .. in是用来根据调用参数进行不同的操作,start-stop-daemon是一个可以管理daemon进程的程序,要查看它的详细说明,可以运行man start-stop-daemon。start的时候,使用–exec指定要执行的文件,stop的时候,使用–name根据进程名字来使用 killall结束匹配的进程。
接着,设置脚本文件属性,设置可执行标记。
root@localhost:~# chmod 755 /etc/init.d/proxy
这样子,就可以使用service命令来启动和关闭进程了,例如启动进程如下:
root@localhost:~# service proxy start
root@localhost:~# ps aux|grep proxy
root       353  1.4  1.9   8644  5212 ?        S    09:50   0:00 /usr/bin/python /root/proxy.py
root       355  0.0  0.2   1900   596 pts/0    S+   09:50   0:00 grep --color=auto proxy
关闭进程,
root@localhost:~# service proxy stop
root@localhost:~# ps aux |grep proxy
root       365  0.0  0.2   1900   592 pts/0    S+   09:51   0:00 grep --color=auto proxy
到这里,一个Linux服务的进程控制脚本已经写好了,但是要实现随机启动,还需要一个步骤。
Linux开机的时候,不是直接运行/etc/init.d下的所有脚本的,而是根据不同的runlevel来执行/etc/rc$runlevel.d 下的脚本。这里的runlevel是用以区别系统的运行方式(例如单用户的runlevel,多媒体桌面的runlevel,服务器的runlevel都 不同)。
在Ubuntu里,可以使用update-rc.d来把/etc/init.d/proxy安装到各个runlevel中。更多关于update-rc.d的说明,请参见man update-rc.d。
root@localhost:~# update-rc.d proxy defaults 99
update-rc.d: warning: /etc/init.d/proxy missing LSB information
update-rc.d: see <http://wiki.debian.org/LSBInitScripts>
 Adding system startup for /etc/init.d/proxy ...
   /etc/rc0.d/K99proxy -> ../init.d/proxy
   /etc/rc1.d/K99proxy -> ../init.d/proxy
   /etc/rc6.d/K99proxy -> ../init.d/proxy
   /etc/rc2.d/S99proxy -> ../init.d/proxy
   /etc/rc3.d/S99proxy -> ../init.d/proxy
   /etc/rc4.d/S99proxy -> ../init.d/proxy
   /etc/rc5.d/S99proxy -> ../init.d/proxy
update-rc.d后面有三个参数,分别是/etc/init.d下的脚本名字,默认安装方式,运行的优先级。优先级的数字越大,表示越迟运行,这里我们把自己写的服务放在最后运行。
如果要卸载随机启动的服务,执行
update-rc.d -f proxy remove
在update-rc.d安装的时候提示了警告信息,是因为我们写的/etc/init.d/proxy太简陋了,连LSB的信息也没有提供。
update-rc.d: warning: /etc/init.d/proxy missing LSB information
update-rc.d: see <http://wiki.debian.org/LSBInitScripts>
只需要做一些小改动,就可以避免那个警告了。如下:
#!/bin/sh
### BEGIN INIT INFO
# Provides:          proxy
# Required-Start:    $remote_fs
# Required-Stop:     $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start or stop the HTTP Proxy.
### END INIT INFO

case "$1" in
start)
        start-stop-daemon --start --background --exec /root/proxy.py
;;
stop)
        start-stop-daemon --stop --name proxy.py
esac
到此,一个最简单的随机启动服务写好了,看起来文章挺长的,但其实也就几个命令而已。
在下次开机启动的时候,proxy.py就会以root用户身份被自动运行。
-------------------------------------------------------------------------
linux启动的脉络

前言
linux有自己一套完整的启动体系,抓住了linux启动的脉络,linux的启动过程将不再神秘。
阅读之前建议先看一下附图。
本文中假设inittab中设置的init tree为:
/etc/rc.d/rc0.d
/etc/rc.d/rc1.d
/etc/rc.d/rc2.d
/etc/rc.d/rc3.d
/etc/rc.d/rc4.d
/etc/rc.d/rc5.d
/etc/rc.d/rc6.d
/etc/rc.d/init.d
目录
1. 关于linux的启动
2. 关于rc.d
3. 启动脚本示例
4. 关于rc.local
5. 关于bash启动脚本
6. 关于开机程序的自动启动
1. 关于linux的启动
  • init是所有进程之父
  • init读取/etc/inittab,执行rc.sysinit脚本
    (注意文件名是不一定的,有些unix甚至会将语句直接写在inittab中)
    rc.sysinit脚本作了很多工作:
    init $PATH
    config network
    start swap function
    set hostname
    check root file system, repair if needed
    check root space
    ....
  • rc.sysinit根据inittab执行rc?.d脚本
  • linux是多用户系统,getty是多用户与单用户的分水岭
    在getty之前运行的是系统脚本

2. 关于rc.d
  • 所有启动脚本放置在 /etc/rc.d/init.d下
  • rc?.d中放置的是init.d中脚本的链接,命名格式是:
    S{number}{name}
    K{number}{name}
    S开始的文件向脚本传递start参数
    K开始的文件向脚本传递stop参数
    number决定执行的顺序

3. 启动脚本示例这是一个用来启动httpd的 /etc/rc.d/init.d/apache 脚本:
代码:

#!/bin/bash

source /etc/sysconfig/rc
source $rc_functionscase "$1" in
start)
echo "Starting Apache daemon..."
/usr/local/apache2/bin/apachectl -k start
evaluate_retval
;;
stop)
echo "Stopping Apache daemon..."
/usr/local/apache2/bin/apachectl -k stop
evaluate_retval
;;
restart)
echo "Restarting Apache daemon..."
/usr/local/apache2/bin/apachectl -k restart
evaluate_retval
;;
status)
statusproc /usr/local/apache2/bin/httpd
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
exit 1
;;
esac

可以看出他接受start,stop,restart,status参数然后可以这样建立rc?.d的链接:
代码:
cd /etc/rc.d/init.d && ln -sf ../init.d/apache ../rc0.d/K28apache && ln -sf ../init.d/apache ../rc1.d/K28apache && ln -sf ../init.d/apache ../rc2.d/K28apache && ln -sf ../init.d/apache ../rc3.d/S32apache && ln -sf ../init.d/apache ../rc4.d/S32apache && ln -sf ../init.d/apache ../rc5.d/S32apache && ln -sf ../init.d/apache ../rc6.d/K28apache
4. 关于rc.local
经常使用的 rc.local 则完全是习惯问题,不是标准。
各个发行版有不同的实现方法,可以这样实现:
代码:

touch /etc/rc.d/rc.local chmod +x /etc/rc.d/rc.local ln -sf /etc/rc.d/rc.local /etc/rc.d/rc1.d/S999rc.local && ln -sf /etc/rc.d/rc.local /etc/rc.d/rc2.d/S999rc.local && ln -sf /etc/rc.d/rc.local /etc/rc.d/rc3.d/S999rc.local && ln -sf /etc/rc.d/rc.local /etc/rc.d/rc4.d/S999rc.local && ln -sf /etc/rc.d/rc.local /etc/rc.d/rc5.d/S999rc.local && ln -sf /etc/rc.d/rc.local /etc/rc.d/rc6.d/S999rc.local

5. 关于bash启动脚本/etc/profile
/etc/bashrc
~/.bash_profile
~/.bashrc
是bash的启动脚本
一般用来设置单用户的启动环境,也可以实现开机单用户的程序,但要明确他们都是属于bash范畴而不是系统范畴。
他们的具体作用介绍如下:
/bin/bash这个命令解释程序(后面简称shell)使用了一系列启动文件来建立一个运行环境:
/etc/profile
/etc/bashrc
~/.bash_profile
~/.bashrc
~/.bash_logout

每一个文件都有特殊的功用并对登陆和交互环境有不同的影响。
/etc/profile 和 ~/.bash_profile 是在启动一个交互登陆shell的时候被调用。
/etc/bashrc 和 ~/.bashrc 是在一个交互的非登陆shell启动的时候被调用。
~/.bash_logout 在用户注销登陆的时候被读取
一个交互的登陆shell会在 /bin/login 成功登陆之后运行。一个交互的非登陆shell是通过命令行来运行的,如[prompt]$/bin/bash。一般一个非交互的shell出现在运行 shell脚本的时候。之所以叫非交互的shell,是因为它不在命令行上等待输入而只是执行脚本程序。
6. 关于开机程序的自动启动
  • 系统脚本可以放置在/etc/rc.d/init.d中并建立/etc/rc.d/rc?.d链接,也可以直接放置在/etc/rc.d/rc.local中。
    init.d脚本包含完整的start,stop,status,reload等参数,是标准做法,推荐使用。
  • 为特定用户使用的程序(如有的用户需要使用中文输入法而有的不需要)放置在~/中的bash启动脚本中。
  • ------------------------------------------------------------------
  • chkconfig some-service --level 345 on

    level是系统运行的等级
    linux os 将操作环境分为以下7个等级:
    0:开机(请不要切换到此等级)
    1:单人使用者模式的文字界面
    2:多人使用者模式的文字界面,不具有网络档案系统(NFS)功能
    3:多人使用者模式的文字界面,具有网络档案系统(NFS)功能
    4:某些发行版的linux使用此等级进入x windows system
    5:某些发行版的linux使用此等级进入x windows system
    6:重新启动
    Ubuntu下面默认是没有chkconfig的,但是可以装上,或者用sysv-rc-conf,是个类似于表格一样的东西,选择开启还是关闭。
     

No comments:

Post a Comment