Linux平台下的service程序编写指南

Hu Dennis Sep 24, 2010转载注明出处http://blog.csdn.net/gobitan

 

摘要:本文主要介绍了如何编写一个service服务所涉及的两个主要方面。1)将一个普通程序装成daemon程序;2)编写service方式的shell脚本。并以C语言为例,基于Red hat 企业版5.3平台演示了一个service服务程序从代码编写到脚本调试以及测试运行全过程。

(一)  Service介绍

Service是一种被称为守护进程(daemon)的程序。它通常一旦启动后就在后台持续运行,通常在等待什么输入或者监控系统有什么变化。例如Apache服务器有一个叫httpd的守护进程监听80端口以等待http请求。

Service程序通常通过service命令来启动或停止等。例如apache服务的启动可通过”service httpd start”来启动。

通过” chkconfig --list”可以查看系统当前所有的service服务。

通过” service --status-all”可以查看系统当前所有service服务的状态。

要自己编写一个类似httpd的service方式的服务应该包括两个部分:(1)将普通程序包装成daemon程序;(2)编写service控制脚本来管理daemon程序。

因此,每个service服务在/etc/rc.d/目录下都对应一个可执行的脚本。如apache的httpd对应/etc/init.d/httpd。

参考资料:http://bobpeers.com/linux/services.php

 

(二)如何将普通程序包装成daemon程序

    这里仅介绍一种较为简单的方式,关于其原理及更详细的介绍请参见本节参考资料。

linux提供了一个名叫daemon的函数来初始化环境,如下:

int daemon(int nochdir, int noclose);

使用该函数需加入#include <stdlib.h>头文件包含。调用该函数之后,其后的程序将会以daemon方式运行。

下面以Hello world为例,因为daemon程序是一个持续运行程序,为了测试运行本文以while+sleep来模拟。

#include <stdio.h>
#include <stdlib.h>int main()
{daemon(0,0);while(1){printf("Hellow World!/n");sleep(100000);}
}

保存上面的测试程序为dennis.c,执行如下编译命令得到dennisd守护进程程序。

#gcc -c dennis.c

# gcc -o dennisd dennis.o

实际运行中,例如你编写了一个tcp服务器程序,可以程序写成一个函数(如tcp_server),然后将while部分更换为你的函数tcp_server()即可。如下:

#include <stdio.h>
#include <stdlib.h>int main()
{daemon(0,0);tcp_server();
}

参考资料: http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html

 

(三)如何编写service控制脚本

    首先脚本必须放在/etc/init.d/目录下,因此本文在先创建/etc/init.d/dennisd脚本文件。内容如下:

#!/bin/bash
#
# Description:  This shell script takes care of starting and stopping dennis
# Hu Dennis created on Sep. 24th, 2010
#
# Source function library
. /etc/init.d/functions#the service name  for example: dennis
SNAME=dennisd#the full path and name of the daemon program
#Warning: The name of executable file must be identical with service name
PROG=/usr/bin/$SNAME# start function
start() {#check the daemon status firstif [ -f /var/lock/subsys/$SNAME ]thenecho "$SNAME is already started!"exit 0;elseaction "Starting $SNAME ..." $PROG[ $? -eq 0 ] && touch /var/lock/subsys/$SNAMEexit 0;fi
}#stop function
stop() {echo "Stopping $SNAME ..."killproc $SNAMErm -rf /var/lock/subsys/$SNAME
}case "$1" in
start)start;;
stop)stop;;
reload|restart)stopstart;;
status)status $SNAME;;
*)echo $"Usage: $0 {start|stop|restart|status}"exit 1
esac

脚本较为简单,再次不做过多解释。然后执行如下命令给dennisd增加可执行权限:

#chmod +x dennisd

(四)常见调试错误

在调试该脚本的时候常见的集中错误如下:

(1)dennisd: unrecognized service:先检查/etc/rc.d/init.d/dennisd是否存在,然后再看该文件是否有可执行权限。

(2)env: /etc/init.d/dennisd: No such file or directory:这种情况一般是windows与linux的格式兼容问题,执行dos2unix将dos格式转换程序linux格式(ubuntu下为fromdos命令)。

(3)Usage: status [-p pidfile] {program}: status后面的参数不对

(4)dennisd dead but subsys locked:可执行程序的名字需要与service名字保持一致。

(五)测试运行

    将第二步编译得到的dennisd程序拷贝至/usr/bin/目录下,然后执行如下命令测试:

(1)启动服务

[root init.d]# service dennisd start

Starting dennisd ... [  OK  ]

通过ps命名确认dennisd已经启动:

[root init.d]# ps -ef|grep dennisd

root      3885     1  0 14:30 ?        00:00:00 /usr/bin/dennisd

(2)查看状态

[root init.d]# service dennisd status

dennisd (pid 3885) is running...

(3)停止服务

[root init.d]# service dennisd stop

Stopping dennisd ...

再执行status命令查看状态

[root init.d]# service dennisd status

dennisd is stopped

(4)多次启动

[root init.d]# service dennisd start

Starting dennisd ... [  OK  ]

[root init.d]# service dennisd start

dennisd is already started!

如果服务已经启动,系统会提示而不会启动多个。

(六)结束语

本文以C语言为例,在linux环境下演示了一个service服务程序从代码编写到脚本调试以及测试运行全过程,希望对有此需求的朋友有所帮助!

centos 最简单的服务程序相关推荐

  1. 基于Golang的简单web服务程序开发——CloudGo

    基于Golang的简单web服务程序开发--CloudGo[阅读时间:约10分钟] 一.概述 二.系统环境&项目介绍 1.系统环境 2.项目的任务要求 (1)基本要求 (2)扩展要求 三.具体 ...

  2. 开发简单 web 服务程序 cloudgo

    任务目标 熟悉 go 服务器工作原理 基于现有 web 库,编写一个简单 web 应用类似 cloudgo 使用 curl 工具访问 web 程序 对 web 执行压力测试 任务要求 基本要求 编程 ...

  3. Centos系统简单的病毒处理

    第一次遇到服务器被植入了挖矿程序,慌的一匹.下面说说我处理这个故障的简单操作, 每天早晨上班第一件事就是打开监控,查看服务器资源占用情况,发现我服务器的双核CPU一直占用率100%. 通过xshell ...

  4. centos lustre 简单 安装教程

    Lustre是一个大规模的.安全可靠的,具备高可用性的集群文件系统,它是由SUN公司开发和维护的. 该项目主要的目的就是开发下一代的集群文件系统,可以支持超过10000个节点,数以PB的数据量存储系统 ...

  5. CentOS 搭建简单svn服务器【转】

    注:1.我这里不认subversion 只认svn.. 2.按照原文例子,配置文件的目录应该为:/opt/svndata/kuming/conf/ 原文:http://holy2010.blog.51 ...

  6. Centos搭建简单的证书机构,CA证书服务器

    CA认证: CA认证,即电子认证服务 [1]  ,是指为电子签名相关各方提供真实性.可靠性验证的活动. 证书颁发机构(CA, Certificate Authority)即颁发数字证书的机构.是负责发 ...

  7. centos搭建简单自用syslog服务器

    1.安装rsyslog软件(rsyslog是syslogd的升级版) yum install -y  rsyslog 2.配置rsyslog.conf文件 vi /etc/rsyslog.conf ( ...

  8. Centos 7 简单的dns配置

    操作环境:Centos7操作系统 首先写好ip,掩码,网关,DNS地址. 将dhcp修改为static 将onboot=no修改为yes 添加自己的ip地址 (我是随便加的) dns地址与dns服务器 ...

  9. Windows 服务程序编写

    摘要:几乎所有的操作系统在启动的时候都会启动一些不需要与用户交互的进程,这些进程在Windows中就被称作服务.它由服务程序.服务控制程序(SCP,service control program)和服 ...

最新文章

  1. ios 应用和电脑共享文件夹_堪比AirDrop,苹果 iPhone与Windows电脑互传文件的三种方式...
  2. Android架构组件LiveData+ViewModel
  3. 【LOJ】#2014. 「SCOI2016」萌萌哒
  4. SAP产品概念及版本简介
  5. mysql知识测试_MySQL基础知识测试
  6. android button的selector
  7. java之的读取文件大全
  8. php mysql中华图书购物商城
  9. python 写excel 保留空格_通过自动填充列中的空格来操作excel表的Python脚本
  10. 哪些管理类的书籍值得推荐?
  11. java 水晶报表教程_水晶报表 (Crystal Reports 2008)的配置
  12. 总线外设基础1——i2s,i2c,uart,spi,touchpanel,lcd
  13. Luogu 1894 [USACO4.2]完美的牛栏The Perfect Stall
  14. 张轩睿和Selina要复合?任家萱的粉丝们会同意吗
  15. 合并多个文件内容到同一个文件
  16. 根据url生成二维码,扫描打开url的两种方法编辑器
  17. 史上最强!PC时代的20位英雄(组图)
  18. mac os下 Ruby环境安装方法
  19. 使用python计算三角形面积
  20. nacivate premium 12.1.12 安装包加破解注册机 亲测可用

热门文章

  1. 如何腾出计算机内存,win7系统(取消)删除虚拟内存让硬盘空间轻松腾出来
  2. 怎么用计算机算账单,电脑如何快速调出计算器
  3. mysql存储过程执行update_MySQL存储过程实现动态执行SQL
  4. 2019年大数据发展趋势预测
  5. 诺奖技术和高通量筛选双双找到新冠病毒的脉门
  6. 1.5 编程基础之循环控制 36 计算多项式的值 python
  7. 1.5编程基础之循环控制 17:菲波那契数列--刘昕源-2019-06-23
  8. feign获取outstream_Spring Cloud Feign接口返回流
  9. latex textbf没有用_使用LaTeX写作业
  10. Qt工作笔记-各种构造函数汇总以及运算符重载(入门必备)