创建自定义Linux服务(原创)

标签: 定义 linux 服务 | 发表时间:2013-02-03 17:42 | 作者:
出处:http://www.iteye.com

概述

网上有不少关于如何让Linux自动运行自己编写的脚本或者程序的方法,但是大多数都是把命令写到/etc/rc.d/rc.local或者/etc/rc.local里,这样虽然能够实现随机运行,但是并不够灵活。不能像mysql,apache等服务一样能够使用service命令或者调用init.d下的脚本启动、关闭或者重启进程。例如,
service mysql restart
service apache2 stop
或者
/etc/init.d/mysql restart
/etc/init.d/apache2 stop
同时也无法整合入heartbeat这样的高可用程序中进行监控。因此,创建自定义的linux服务还是有其必要性的。
因为不同的Linux发行版本,对后台服务的处理方式不大一样,所以下面以RHEL系统为例,编写一个Oracle随机启动服务。

创建服务

服务脚本

cat /etc/init.d/czm
#!/bin/bash
# chkconfig: 2345 20 81
#description: czmmmmm                      
export ORACLE_SID=orcl
export ORACLE_PID=`ps -ef|grep ora|grep -E 'smon|pmon|ckpt'|wc -l`
export ORACLE_BASE=/u01/app
export ORACLE_HOME=/u01/app/oracle
export PATH=$PATH:$ORACLE_HOME/bin
ORA_OWNR="oracle"
if [ ! -f $ORACLE_HOME/bin/dbstart -o ! -d $ORACLE_HOME ]
   then
   echo "Oracle startup:can't start"
   exit 1
fi
case "$1" in
  start)
  echo -n "Starting Oracle:"
  su - $ORA_OWNR -c "$ORACLE_HOME/bin/dbstart"
  echo "OK"
  ;;
  stop)
  echo -n "Shutdown Oracle:"
  su - $ORA_OWNR -c "$ORACLE_HOME/bin/dbshut"
  echo "OK"
  ;;
  status)
  if [ $ORACLE_PID = "3" ];then
     echo "Oracle Instance is running..."
  else echo "Oracle Instance is not running..."
  fi
  ;;
  restart)
  $0 stop
  $0 start
  ;;
  *)
  echo "Usage:`basename $0` start|stop|status|restart"
esac
exit $?

脚本说明

#!/bin/bash,声明脚本采用bash作为shell。#chkconfig后面三个参数分别表示服务在哪几个运行级别启动(本例是在2,3,4,5),在启动和关闭时服务脚本执行的优先级。#description是对该服务的描述。加上这两行之后才能用chkconfig命令添加服务。另外,服务脚本最好放在/etc/init.d/目录下

一个linux服务脚本必须包含start,stop和restart,而status不是必须的。关于status有两种方式实现以查看程序的运行状态,一种为上文提到的根据程序的特点自行编写判断脚本,另一种则是利用linux自带的/etc/init.d/functions这个脚本中包含了下面包含的status函数,来打印当前服务进程的状态 当然前提是运行的程序能够产生pid文件 ,代码如下

#!/bin/bash
# autoruntest the shell script takes care of autoruntest auto start and stop
# chkconfig:   2345 20 80
# description: autoruntest
# processname:     /etc/rc.d/init.d/autoruntest
EXEC_PATH=/home/paradis/app
EXEC=autoruntest
PID_FILE=/var/run/autoruntest.pid
DAEMON=/home/paradis/code/autoruntest
# Source function library.
.  /etc/rc.d/init.d/functions
if ! [ -x $EXEC_PATH/$EXEC ] ; then
    echo "ERROR: $EXEC_PATH/$EXEC not found"
    exit 1
fi

stop()
{
    echo "Stoping $EXEC ..."
    killall $DAEMON >/dev/null
    usleep 100
    echo "Shutting down $EXEC: [ OK ]"

   rm -f /var/lock/subsys/Oracle
}

start()
{

    touch /var/lock/subsys/Oracle
    echo "Starting $EXEC ..."
    $DAEMON > /dev/null &
    usleep 100
    echo "Starting $EXEC: [ OK ]"
}

restart()
{
    stop
    start
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        restart
        ;;
    status)
        status -p $PID_FILE $DAEMON
    ;;
    *)
        echo "Usage: service $EXEC {start|stop|restart|status}"
        exit 1
esac
exit $?

两点说明

1、/var/run

根据linux的文件系统分层结构标准(FHS)中的定义:

/var/run目录中存放的是自系统启动以来描述系统信息的文件。比较常见的用途是daemon进程将自己的pid保存到这个目录。FHS标准要求这个文件夹中的文件必须是在系统启动的时候清空,以便建立新的文件。
为了达到这个要求,某些linux中/var/run使用的是tmpfs文件系统,这是一种存储在内存中的临时文件系统,当机器关闭的时候,文件系统自然就被清空了。使用df -Th命令能看到类似的输出结果:
文件系统    类型    容量  已用  可用 已用%% 挂载点
none         tmpfs    990M  384K  989M   1% /var/run
none         tmpfs    990M     0  990M   0% /var/lock
当然/var/run除了保存进程的pid之外也有其他的作用,比如utmp文件,就是用来记录机器的启动时间以及当前登陆用户的。

2、/var/lock/subsys
/var/lock/subsys/目录表示文件是否上所,通常与/var/run目录结合使用以判断程序是否进行

参考至:http://blog.csdn.net/q191201771/article/details/6134512
               http://space.itpub.net/26442672/viewspace-715235

               http://www.508648.com/post-5.html

               http://www.cnblogs.com/silverwings/archive/2010/08/02/1790801.html

               http://xiaoxia.org/2011/11/15/create-a-simple-linux-daemon/

               http://www.hao32.com/unix-linux/39.html

               http://hi.baidu.com/naruto6006/item/3bf69a234ed390142a0f1cdd

本文原创,转载请注明出处、作者

如有错误,欢迎指正
邮箱:[email protected]



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [定义 linux 服务] 推荐:

创建自定义Linux服务(原创)

- - ITeye博客
网上有不少关于如何让Linux自动运行自己编写的脚本或者程序的方法,但是大多数都是把命令写到/etc/rc.d/rc.local或者/etc/rc.local里,这样虽然能够实现随机运行,但是并不够灵活. 不能像mysql,apache等服务一样能够使用service命令或者调用init.d下的脚本启动、关闭或者重启进程.

centos linux 服务器安全

- - 操作系统 - ITeye博客
我们必须明白:最小的权限+最少的服务=最大的安全. 所以,无论是配置任何服务器,我们都必须把不用的服务关闭、把系统权限设置到最小话,这样才能保证服务器最大的安全. 下面是CentOS服务器安全设置,供大家参考. 一、注释掉系统不需要的用户和用户组. 注意:不建议直接删除,当你需要某个用户时,自己重新添加会很麻烦.

自建基于 Linux 的 Time Capsule 服务

- Class4 - Gracecode.com
2011-02-14 更改 netatalk 部分配置参数. 2011-02-10 初始化版本. Apple 的 Time Machine 提供了非常完备的数据备份方案,但每次使用外接磁盘备份很 麻烦也很容易忘记备份. 同时,个人对于 Time Capsule “高昂的”售价(虽然它的确值那些钱)颇有微词.

Linux服务器性能评估

- peigen - 唐福林-博客雨
一、影响Linux服务器性能的因素. 影响性能因素 评判标准 好 坏 糟糕 CPU user% + sys%< 70% user% + sys%= 85% user% + sys% >=90% 内存 Swap In(si)=0 Swap Out(so)=0. Per CPU with 10 page/s More Swap In & Swap Out 磁盘 iowait % < 20% iowait % =35% iowait % >= 50%.

[转]Linux下安装Oracle11g服务器

- - 小鸥的博客
                     Linux服务器:SuSe10 sp2 64位.                      Oracle服务器:Oracle11gR2 64位. Linux安装Oracle系统要求. 一般为内存的2倍,例如:1G的内存可以设置swap 分区为3G大小.  2.修改操作系统核心参数.

Linux服务器性能评估

- - 操作系统 - ITeye博客
一、影响Linux服务器性能的因素. 二、系统性能评估标准. %user:表示CPU处在用户模式下的时间百分比. %sys:表示CPU处在系统模式下的时间百分比. %iowait:表示CPU等待输入输出完成时间的百分比. swap in:即si,表示虚拟内存的页导入,即从SWAP DISK交换到RAM.

了解 Linux,302(混合环境): 文件服务

- Power - IBM developerWorks 中国 : 文档库
通过为面向系统管理员的 Linux 专业协会认证考试 LPI-302 做准备,了解如何配置 Samba 和构造配置文件. Samba 如何与网络进行交互,如何配置日志,以及如何调试 Samba 问题.

为生产服务器选择合适的Linux发行版

- Derek - 花开的地方
抛出这个问题,是因为之前与同事的争论以及最近与同事的争论——我可保持沉默,但不可以停止思考. 我想大多数有经验的Linux用户,会觉得这个问题不是问题,那么请不要急,待会儿我会让你知道这个问题为什么是个问题. 首先,在讨论这个问题之前, 我们一定要先了解自己的自身的条件:即我们自身的技术能力——假如我们有能力像RedHat、Google一样,自己跟踪Linux以及开源社区,那么,我们完成可以搞个自己用的发行出来.

Unix/Linux时区服务器因版权诉讼关闭

- Lamo - Solidot
Unix/Linux时区服务器的维护者Arthur David Olson通过邮件列表宣布,由于时区服务器卷入了侵犯版权的诉讼案,ftp://elsie.nci.nih.gov服务器和邮件列表将相继关闭. 原来是一家名叫Astrolabe的公司购买了《The American Atlas》的版权. 该书是一本天文测量历史参考书,收集了美国从1850年到2000年的地理位置、时区和完整时钟设置历史.