Linux service程序

来源:互联网 发布:大数据可以洞察什么 编辑:程序博客网 时间:2024/06/05 16:46
在linux系统启动的时候,我们可以看到很多服务性程序一个接一个的被启动(就是那些后面有一个兰色[OK]的行),这些在后台运行的程序为我们使用计算机起了很重要的作用,以这种方式运行的程序有以下特点:
开机启动,关机停止
后台运行
通过service 命令控制或查看对应的程序的运行状态
那怎么把我们自己编制的程序做成这样的一个服务呢?
主要分以下3步:

1、把可执行程序放到一个linux系统可以找到的地方。
在linux命令提示符下输入 env ,回车后可看到环境变量,里面有一项PATH的,这项里所指定的目录都是系统可找到的地方,把我们的可执行程序放入其中的一个目录下即可,我们一般放在/usr/sbin/目录下。

2、在目录 /etc/init.d/ 下,新建一个以服务名为文件名的文件。
如果我们打开目录 /etc/init.d/,看到的文件其实都是服务程序文件,每个文件的内容都大同小异,我们会看到,这里的文件在文件结构上几乎是一样的。几乎每个文件 都有 start、stop、restart和status这样的标志,我们新建的这个文件也具有相同的结构,只是在这些标志内部把相应的可执行程序换成我 们自己的可执行程序即可.那就是:复制——修改——保存。

3、在目录 /etc/rc3.d/ 下,新建一个指向在第2步中建立的服务文件的符号连接文件。
打开目录 /etc/rc3.d/ ,我们将看到这里都是符号连接文件(linux系统中的符号连接相当于windows中的快捷方式)。采用以下命令格式:
ln -sf 目标文件名 连接文件名
连接文件名益采用“SXX目标文件名”的格式,其中XX一般是一个从1到100的整数,它表示启动优先级,数字越大,优先级越低,比如:服务A的运行要依 赖服务B,那A的XX数字就应该大于B的。后跟“目标文件名”是为了一目了然,一看就知道是哪个文件的符号连接。
目录 /etc/rc3.d/ 是系统启动时自动搜索的目录,该目录下的符号连接文件的目标文件,都将被运行,这就是在这个目录建立符号连接的原因——为了开机就运行。

好了,完成以上3个步骤,你就把自己的一个可执行程序做成系统的一个服务了,它具有我们一开始说的几个特定。我们可以用service命令控制这个程序了:
启动:service hdz_service start
停止:service hdz_service stop
重启:service hdz_service restart
上面的 hdz_service 为服务名,也就是在第2步中建立的文件名。

不过,好象感觉比较麻烦,能否把这几个步骤自动化一下?还记得我们那个记录代码文件之间依赖关系的makefile文件吗?
在makefile文件中添加一个标志,并在该标志下添加和下面类似的代码:

install:cp ./hdz_pro /usr/sbin/cp ./hdz_service /etc/init.d/cd /etc/init.d/chmod +x hdz_servicecd /etc/rc3.d/ln -sf ../init.d/hdz_service ./S99hdz_service

在标志install下的没一句话,前面一定要留空白,这不仅是有利于阅读,更是一个要求,makefile文件要求每一句可执行语句前都要有空白(空格或tab)。
上面代码中的 hdz_pro 和 hdz_service 分别是可执行文件名和服务名,这两个名称换成你自己的就行了,操作时用以下命令:
make install
大家在看我写的东东时,时不时会碰到“hdz”这样的东西,这是我名字的缩写,说明这正是要替换的。

一般系统的运行级别是在 /etc/inittab 里面指定的。有一行是类似
id:5:initdefault:
或者
id:3:initdefault:
的,这里的数字就是系统的默认运行级别。假设是 5。

启动服务的是依靠 /etc/init.d/ 下的脚本启动的。这些都是普通的 shell 脚本,系统在调用的时候,如果是启动服务,则传入 start 作为参数;stop 表示停止;restart 表示重启。因此你可以写一个脚本,比如简单的如这样:
#!/bin/shARG=$1case $ARG instart):nohup /path/to/your/program &;;stop):pkill program;;restart):pkill programnohup /path/to/your/program &;;esac
把这个脚本放在 /etc/init.d 里面,譬如 /etc/init.d/your_prog
然后加入相应运行级别的链接:在 5 级启动则
ln -s /etc/init.d/your_prog /etc/rc5.d/S100your_progln -s /etc/init.d/your_prog /etc/rc0.d/K100your_prog
这里两个数字都可以用对应目录里最大的数字,因为没有别的服务依赖你的服务。
这样表示,当系统进入 init level 5 的时候启动你的程序,进入 init level 0 的时候停止你的程序。

nohup是告诉系统忽略用户退出系统
让进程运行直到进程结束为止
比如我在远程打开ssh终端运行程序./server
如果不用nohup当我关闭ssh终端时
./server进程将会中止
使用nohup ./server &
可以在用户退出终端时
进程能继续执行