`
csh081
  • 浏览: 17647 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多

把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 &
可以在用户退出终端时
进程能继续执行
分享到:
评论

相关推荐

    Liunx可执行程序做成服务

    ### Liunx可执行程序做成服务 #### 概述 在Linux系统中,将一个可执行的Shell脚本程序转化为系统服务,可以极大地方便我们对这个程序进行管理和监控。通常,这种转换需要通过一系列步骤来完成,包括但不限于编写一...

    Qt5.9.1可执行程序做成可执行文件的步骤

    ### Qt5.9.1可执行程序转换为安装文件的步骤详解 #### 一、简述 本篇文章将详细介绍如何将Qt5.9.1开发的可执行程序转化为可直接安装使用的`.exe`安装文件。这不仅适用于Qt5.9.1版本,也适用于其他版本的Qt框架开发...

    Qt5.9.1可执行程序做成软件安装包的步骤

    在软件开发过程中,尤其是使用Qt框架开发的应用程序,开发者常常需要将编译生成的可执行程序(exe文件)封装成安装包,以便于用户安装与使用。本文将详细介绍如何使用Inno Setup这款强大的工具,将Qt5.9.1生成的可...

    Linux下打包发布QT程序,并运行在其他没有安装QT环境或多个QT环境的linux系统上

    5. **打包和部署**:将静态编译的Qt应用程序、所有依赖的库文件和启动脚本打包成一个压缩文件,如`.tar.gz`或`.deb`包。确保在目标系统上解压后,能够直接运行启动脚本来启动应用程序。如果目标系统是Debian或Ubuntu...

    第7题:在Linux中下修改一个现有的elf可执行程序1

    在Linux系统中,修改现有的ELF可执行程序是一项高级技术,涉及到对二进制文件的直接操作。ELF(Executable and Linkable Format)是Linux和其他类UNIX系统中广泛使用的文件格式,用于存放可执行程序、动态库和共享...

    web前端页面生成exe可执行文件的方法

    Electron 是一个使用 web 技术构建跨平台桌面应用的框架,它可以将网页打包成桌面应用,生成 exe 可执行文件。Electron 使用的是 Chromium 和 Node.js 的技术,可以使用 HTML、CSS 和 JavaScript 来构建桌面应用。 ...

    安徽工业大学2011年《Linux程序设计试卷》

    这条命令使用GCC编译器将 `test.c` 文件编译成一个名为 `test` 的可执行文件。 **5. 符号链接创建:** - `ln test.c ff.c` 这条命令将在当前目录下为 `test.c` 创建一个名为 `ff.c` 的硬链接。这意味着 `ff.c` 和 ...

    jar包做服务nssm实例

    将java应用程序做成开机自启动服务,附件中通过nssm将jar应用程序做成服务的操作说明及实例。下载即可运行,可仿照类似做成服务! 第一步: 将 jar 包及其依赖包放置运行目录. 假设目录结构为 /lib(第三方依赖) app...

    PaddleOCR做成exe程序,打开即用,无需安装任何环境,还可以POST访问

    将最新的PaddleOCR部署到windows10上面,并且连同环境一起,打包成exe程序,打开直接运行,并且是做成web服务的方式,在浏览器里面输入http://localhost:18888/docs即可访问

    linux上通过sh方式启动java jar程序并做为守护进程

    现在,你的Java JAR程序已经作为一个守护进程在Linux系统中运行,即使用户注销或系统重启,它也会继续运行。 注意,确保正确配置了Java环境,系统中已安装Java,并且JAR文件路径和主类名是准确无误的。同时,根据...

    linux设备驱动程序(中文第三版) 2.6内核.pdf

    - **准备环境**:搭建一个适合测试驱动程序的Linux系统环境。 - **步骤**: - 选择合适的发行版。 - 安装必要的开发工具包。 - 配置内核选项。 #### 2.2 HelloWorld模块 - **入门示例**:创建一个简单的Hello...

    使用tkinter库做了一个相册程序,并使用PyInstaller打包

    使用tkinter库做了一个相册程序,并使用PyInstaller(这是一个流行的打包工具,可以将Python应用程序打包成独立的可执行文件。它支持Windows、macOS和Linux)打包。

    Android 加载执行ELF可执行文件

    当一个ELF可执行文件被调用时,系统会通过以下步骤来执行: 1. **加载阶段**:首先,系统会在内存中为ELF文件分配空间,并按照ELF头部信息将文件内容映射到内存。头部信息包含了文件的结构、段位置、加载地址等关键...

    如何把一个java程序打包成exe文件.doc

    **工具推荐:** `install4j` 是一个强大的、跨平台的Java安装程序生成工具。它可以轻松创建本地化安装程序,并支持灵活的JRE管理和部署选项。 **使用步骤:** 1. **创建发布树**: 使用install4j的图形用户界面来定义...

    Linux操作系统基础教程

    可以自由传播且可任人修改、充实、发展,开发者的初衷是要共同创造一个完美、理想并 可以免费使用的操作系统。 我们并不能使同学们通过这次系列讲座成为一个 UNIX 类操作系统的高手,这次系列 讲座的目的就是在...

    实战LINUX_SHELL编程与服务器管理.pdf

    Shell作为操作系统的一个重要组件,是用户与系统核心之间的接口,几乎所有管理者在日常工作中都会频繁地与Shell打交道。Shell具有解释和执行用户输入命令的能力,而这些命令通常用于访问文件系统、创建和管理进程、...

    一步一步学习linux汇编语言程序设计

    3. **链接**:使用链接器将一个或多个目标文件链接成可执行文件。在Linux下,常用的链接器是`ld`。 4. **调试**:使用调试器(如gdb)对程序进行调试,检查和修正错误。 #### Linux汇编语言的关键特性 - **直接...

    linux下C编程高效手册

    编译完成后,可以通过链接器(通常是gcc本身)将一个或多个对象文件链接成一个单一的可执行文件。 例如,对于一个简单的源程序hello.c,编译命令可以如下: ```bash gcc -o hello hello.c ``` 执行该命令后,GCC会...

    jar包做成服务.zip

    在Java开发中,将一个`jar`包做成服务是一项常见的任务,这通常涉及到将Java应用程序打包成可执行的`jar`文件,并通过特定的方式运行它作为后台服务,以实现持续运行和管理。以下是对这个主题的详细解释: 一、什么...

    linux下操做OV5640摄像头

    使用`make`命令可以将源代码编译成可执行文件。 5. **图像处理**:在Linux下,可以利用OpenCV、GStreamer等库进行图像处理任务,如图像预处理、特征检测、图像分析等。这些库提供了丰富的函数和算法,简化了图像...

Global site tag (gtag.js) - Google Analytics