当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

把linux可执行程序做成一个服务

发表于: 2014-07-24   作者:csh081   来源:转载   浏览:
摘要: 把linux可执行程序做成一个服务 2012-08-23 10:42:41   原文出处 先说下/etc/rc.d/目录: rc.d的内容如下: init.d/ :各种服务器和程序的二进制文件存放目录。 rcx.d/: 各个启动级别的执行程序连接目录。里头的东西都是指向init.d/的一些软连接。具体的后边叙述。 还有三个脚本:rc.sysinit, rc,

把linux可执行程序做成一个服务

2012-08-23 10:42:41

 
原文出处

先说下/etc/rc.d/目录:
rc.d的内容如下:
init.d/ :各种服务器和程序的二进制文件存放目录。
rcx.d/: 各个启动级别的执行程序连接目录。里头的东西都是指向init.d/的一些软连接。具体的后边叙述。
还有三个脚本:rc.sysinit, rc, rc.local

redhat的启动方式和执行次序是:
加载内核
执行init程序
/etc/rc.d/rc.sysinit # 由init执行的第一个脚本
/etc/rc.d/rc $RUNLEVEL # $RUNLEVEL为缺省的运行模式
/etc/rc.d/rc.local
/sbin/mingetty # 等待用户登录

在Redhat中,/etc/rc.d/rc.sysinit主要做在各个运行模式中相同的初始化工作,包括:
调入keymap以及系统字体
启动swapping
设置主机名
设置NIS域名
检查(fsck)并mount文件系统
打开quota
装载声卡模块
设置系统时钟
等等。
/etc/rc.d/rc则根据其参数指定的运行模式(运行级别,你在inittab文件中可以设置)来执行相应目录下的脚本。凡是以Kxx开头的
,都以stop为参数来调用;凡是以Sxx开头的,都以start为参数来调用。调用的顺序按xx
从小到大来执行。例如,假设缺省的运行模式是3,/etc/rc.d/rc就会按上述方式调用
/etc/rc.d/rc3.d/下的脚本。
值得一提的是,Redhat中的运行模式2、3、5都把/etc/rc.d/rc.local做为初始化脚本中
的最后一个,所以用户可以自己在这个文件中添加一些需要在其他初始化工作之后,登录之前执行的命令。
init在等待/etc/rc.d/rc执行完毕之后(因为在/etc/inittab中/etc/rc.d/rc的
action是wait),将在指定的各个虚拟终端上运行/sbin/mingetty,等待用户的登录。
至此,LINUX的启动结束。


在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_service
cd /etc/rc3.d/
ln -sf ../init.d/hdz_service ./S99hdz_service

    在标志install下的没一句话,前面一定要留空白,这不仅是有利于阅读,更是一个要求,makefile文件要求每一句可执行语句前都要有空白(空格或tab)。
上面代码中的 hdz_pro 和 hdz_service 分别是可执行文件名和服务名,这两个名称换成你自己的就行了,操作时用以下命令:
make install
运行完就一切OK了,简单吧?

    大家在看我写的东东时,时不时会碰到“hdz”这样的东西,这是我名字的缩写,说明这正是要替换的。

-----------------------------------------------------

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

启动服务的是依靠 /etc/init.d/ 下的脚本启动的。这些都是普通的 shell 脚本,系统在调用的时候,如果是启动服务,则传入 start 作为参数;stop 表示停止;restart 表示重启。因此你可以写一个脚本,比如简单的如这样:

#!/bin/sh

ARG=$1

case $ARG in
start):
nohup /path/to/your/program &
;;
stop):
pkill program
;;
restart):
pkill program
nohup /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_prog
ln -s /etc/init.d/your_prog /etc/rc0.d/K100your_prog
这里两个数字都可以用对应目录里最大的数字,因为没有别的服务依赖你的服务。
这样表示,当系统进入 init level 5 的时候启动你的程序,进入 init level 0 的时候停止你的程序。

----------------------------------------------------------
系统服务介绍
1. alsasound :Alsa声卡驱动守护程序。
2. acpid:acpid(Advanced Configuration and Power Interface)是为替代传统的APM电源管理标准而推出的新型电源管理标准。通常笔记本电脑需要启动电源进行管理。
3. atalk:AppleTalk网络守护进程。
4. amd: 自动安装NFS守护进程。
5. anacron:一个自动化运行任务守护进程。
6. apmd:apmd(Advanced Power Management)是高级电源管理。
7. arptables_jf :为arptables网络的用户控制过滤的守护进程。
8. arpwatch: 记录日志并构建一个在LAN接口上看到的以太网地址和IP地址对数据库。
9. autofs:自动安装管理进程automount,与NFS相关,依赖于NIS服务器。
10. bootparamd:引导参数服务器,为LAN上的无盘工作站提供引导所需的相关信息。
11. bluetooch:蓝牙服务器守护进程。
12. crond :cron是Unix下的一个传统程序,该程序周期地运行用户调度的任务。比起传统的Unix版本,Linux版本添加了不少属性,而且更安全,配置更简单。类似计划任务。
13. chargen:使用tcp协议的chargen server,chargen(Character Generator Protocol)是一种网络服务,主要功能是提供类似远程打字的功能。
14. chargen-udp:使用UDP协议的chargen server。
15. cpuspeed:监测系统空闲百分比,降低或加快CPU时钟速度和电压从而在系统空闲时将能源消耗降为最小,而在系统繁忙时最大化加快系统执行速度。
16. dhcpd:动态主机控制协议(Dynamic Host Control Protocol)的服务守护进程。
17. cups: cups(Common UNIX Printing System)是通用UNIX打印守护进程。
18. cups-config-daemons:cups打印系统切换守护进程。
19. cups-lpd:cups行打印守护进程。
20. daytime:使用TCP 协议的Daytime守护进程,该协议为客户机实现从远程服务器获取日期和时间的功能。预设端口:13。
21. daytime-udp:使用UDP 协议的Daytime守护进程。
22. dc_server:使用SSL安全套接字的代理服务器守护进程。
23. dc_client:使用SSL安全套接字的客户端守护进程。
24. diskdump:服务器磁盘备份守护进程。
25. echo:服务器回显客户数据服务守护进程。
26. echo-udp:使用UDP协议的服务器回显客户数据服务守护进程。
27. eklogin:接受rlogin会话鉴证和用kerberos5加密的一种服务的守护进程。
28. gated :网关路由守护进程。它支持各种路由协议,包括RIP版本1和2、DCN HELLO协议、 OSPF版本2以及EGP版本2到4。
29. gpm:gpm(General Purpose Mouse Daemon )守护进程为文本模式下的Linux程序如mc(Midnight Commander)提供了鼠标的支持。
30. gssftp: 使用kerberos 5认证的ftp守护进程
31. httpd:Web服务器Apache守护进程。
32. inetd :因特网操作守护程序。
33. innd:Usenet新闻服务器守护进程。
34. iiim:中文输入法服务器守护进程。
35. iptables:iptables防火墙守护进程。
36. irda:红外端口守护进程。
37. isdn:isdn启动和中止服务守护进程。
38. krb5-telnet:使用kerberos 5认证的telnet守护进程。
39. klogin:远程登陆守护进程。
40. keytable:该进程的功能是转载在/etc/sysconfig/keyboards里定义的键盘映射表,该表可以通过kbdconfig工具进行选择。您应该使该程序处于激活状态。
41. irqbalance:对多个系统处理器环境下的系统中断请求进行负载平衡的守护程序。如果你只安装了一个CPU,就不需要加载这个守护程序。
42. kshell :kshell守护进程。
43. kudzu:硬件自动检测程序。
44. ldap:ldap(Lightweight Directory Access Protocol)目录访问协议服务器守护进程。
45. lm_seroems:检测主板工作情况守护进程。
46. lpd :lpd是老式打印守护程序,负责将lpr等程序提交给打印 作业。
47. mdmonitor:RAID相关设备的守护程序。
48. messagebus:D-BUS是一个库,为两个或两个以上的应用程序提供一对一的通讯。
49. microcode_ctl:可编码以及发送新的微代码到内核以更新Intel IA32系列处理器。
50. mysqld: 一个快速高效可靠的轻型SQL数据库引擎守护进程。
51. named:DNS(BIND)服务器守护进程。
52. netplugd:netplugd(network cable hotplug management daemon)守护程序,用于监控一个或多个网络接口的状态,当某些事件触发时运行一个外部脚本程序。
53. netdump:远程网络备份服务器守护进程。
54. netfs:Network Filesystem Mounter,该进程安装和卸载NFS、SAMBA和NCP网络文件系统。
55. nfs:网络文件系统守护进程。
56. nfslock:NFS是一个流行的通过TCP/IP网络共享文件的协议,此守护进程提供了NFS文件锁定功能。
57. ntpd:Network time Protocol daemon(网络时间校正协议)。ntpd是用来使系统和一个精确的时间源保持时间同步的协议守护进程。
58. network:激活/关闭启动时的各个网络接口守护进程。
59. psacct:该守护进程包括几个工具用来监控进程活动的工具,包括ac,lastcomm, accton 和sa。
60. pcmcia:主要用于支持笔记本电脑接口守护进程。
61. portmap:该守护进程用来支持RPC连接,RPC被用于NFS以及NIS 等服务。
62. postgresql: PostgreSQL 关系数据库引擎。
63. proftpd: proftpd 是Unix下的一个配置灵活的ftp服务器的守护程序。
64. pppoe:ADSL连接守护进程。
65. random :保存和恢复系统的高质量随机数生成器,这些随机数是系 统一些随机行为提供的。
66. rawdevices:在使用集群文件系统时用于加载raw设备的守护进程。
67. readahead、readahead_early:readahead和readahead_early是在Fedora core 2中最新推出的两个后台运行的守护程序。其作用是在启动系统期间,将启动系统所要用到的文件首先读取到内存中,然后在内存中进行执行,以加快系统的启动速 度。
68. rhnsd:Red Hat 网络服务守护进程。通知官方的安全信息以及为系统打补丁。
69. routed :该守护程序支持RIP协议的自动IP路由表维护。
70. rsync:remote sync远程数据备份守护进程。
71. rsh :远程主机上启动一个shell,并执行用户命令。
72. rwhod: 允许远程用户获得运行rwho守护程序的机器上所有已登录用户的列表。
73. rstatd:一个为LAN上的其它机器收集和提供系统信息的守候进程。
74. ruserd:远程用户定位服务,这是一个基于RPC的服务,它提供关于当前记录到LAN上一个机器日志中的用户信息
75. rwalld:激活rpc.rwall服务进程,这是一项基于RPC的服务,允许用户给每个注册到LAN机器上的其他终端写消息。
76. rwhod:激活rwhod服务进程,它支持LAN的rwho和ruptime服务。
77. saslauthd: 使用SASL的认证守护进程。
78. sendmail:邮件服务器sendmail守护进程。
79. smb:Samba文件共享/打印服务守护进程。
80. snmpd:本地简单网络管理守护进程。
81. squid:代理服务器squid守护进程。
82. sshd:OpenSSH服务器守护进程。Secure Shell Protocol可以实现安全地远程管理主机。
83. smartd:Self Monitor Analysis and Reporting Technology System,监控你的硬盘是否出现故障。
84. syslog:一个让系统引导时起动syslog和klogd系统日志守候进程的脚本。
85. time :该守护进程从远程主机获取时间和日期,采用TCP协议。
86. time-udp: 该守护进程从远程主机获取时间和日期,采用UDP协议。
87. tux:在Linux内核中运行apache服务器的守护进程。
88. vsftpd:vsftpd服务器的守护进程。
89. vncserver: VNC (Virtual Network Computing,虚拟网络计算)。
90. xfs:X Window字型服务器守护进程,为本地和远程X服务器提供字型集。
91. xinetd:支持多种网络服务的核心守护进程。
92. ypbind:为NIS(网络信息系统)客户机激活ypbind服务进程 。
93. yppasswdd:NIS口令服务器守护进程。
94. ypserv:NIS主服务器守护进程。
95. yum:RPM操作系统自动升级和软件包管理守护进程。
可以根据自己的需要觉得是否启动某系服务。如:u、iptables等是必须要运行的。echo、echo-udp、daytime、daytime- udp、chargen、chargen -udp做调试用可以关闭。rsh、rstatd、rsync、rusersd、rwalld这些命令都是Berkley远程命令,因为都以字母r开头, 故称 r*命令。主要使用来使一台计算机上的某个用户以相同的帐户远程执行另一台计算机的一个程序,不要可以关闭,减少隐患。innd是运行新闻组服务的进程, 不要可以关闭。

----------------------------------------------------------

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

把linux可执行程序做成一个服务

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号