最近写了个程序需要随Linux启动时自动运行起来, 查了一些方法后, 通过配置程序成为系统的服务实现了这个需求, 在此记录一下.

测试程序

#! /bin/sh

while [ true ]
do
echo "[`date +%Y%m%d-%H%M%S`]" >> /var/log/test_sh.log
sleep 5
done

每5秒, 向/var/log/test_sh.log 输出一个当前时间的字符串, 保存为test_sh

服务控制脚本

通过此服务控制脚本, 可以实现通过系统的service命令设置这个服务的start, stop, 以及运行status查询状态, 保存为tstd. 服务控制脚本后接d是一种惯例性的命名, 代表daemon.

#! /bin/sh

# chkconfig: 35 99 99
# descroption: service test script
# processname: test_sh ### BEGIN INIT INFO
# Provides: tstd
# Required-Start:
# Should-Start:
# Required-Stop:
# Should-Stop:
# Default-Start: 2 3 5
# Default-Stop: 0 1 2 6
# Description: service test script
#
### END INIT INFO

通过以上注释, 可通过chkconfig或者insserv命令来安装服务, 指定服务的在Linux的对应的执行等级中自启动以及停止, 并设定启动顺序.

Linux执行等级:

  • 等级0表示:表示关机
  • 等级1表示:单用户模式
  • 等级2表示:无网络连接的多用户命令行模式
  • 等级3表示:有网络连接的多用户命令行模式
  • 等级4表示:不可用
  • 等级5表示:带图形界面的多用户模式
  • 等级6表示:重新启动
TEST_BIN='/usr/sbin/test_sh'
source /etc/rc.status
test -x $TEST_BIN || exit 5 rc_reset

这一段在/usr/sbin/中检查服务对应的脚本程序是否存在, 并加载/etc/rc.status这个脚本, rc.status脚本中包含了rc_reset, rc_status, rc_failed, rc_reset, rc_exit等有用的命令, 可以通过接受上一条命令的结果, 在service命令执行时显示出不同的效果.

case "$1" in
start)
echo "starting test daemon"
startproc $TEST_BIN
rc_status -v
;; stop)
echo "stop test daemon"
killproc $TEST_BIN
rc_status -v
;; status)
echo "stop test daemon"
checkproc $TEST_BIN
rc_status -v
;; *)
echo "Usage: $0 { start | stop | status }"
exit 1
;;
esac

startproc 默认通过程序的绝对路径和/var/run/<basename>.pid 来检索程序是否运行, 没有检索到时便以后台的方式来运行程序.

killproc则会通过通过向程序发送SIGTERM来终止程序的运行, 若程序没有响应, 还会依次发送SIGHUP, 以及SIGKILL来删除程序, 确认程序已关闭后吗会删除程序产生的PID文件.

checkproc会检查程序的状态, 根据程序的状态返回不同的值:

  • 0: 服务运行中
  • 1: 服务停止, 但是/var/run 下的pid文件仍然存在
  • 2: 服务停止, 但是/var/lock 下的文件仍然存在
  • 3: 服务没有在运行

安装脚本

#! /bin/sh

ROOT_DIR=$(echo $(cd "$(dirname "$0")"; pwd))

echo $ROOT_DIR
service tstd stop > /dev/null 2>&1 install -m 750 ${ROOT_DIR}/test_sh /usr/sbin/
install -m 750 ${ROOT_DIR}/tstd /etc/init.d/ chkconfig -a tstd > /dev/null 2>&1
service tstd start > /dev/null 2>&1
echo -e "#!/bin/sh \n service tstd start > /dev/null 2>&1" \
> /etc/cron.hourly/tst_crontab echo 'success'

安装脚本使用install命令来拷贝脚本到指定目录, 并设置对应的权限. chkconfig命令可以将这个自定义的服务添加到设定的执行等级的自启动中, 即在/etc/rc*.d中创建顺序对应的符号链接.

最后在/etc/cron.hourly中创建了一个脚本来每小时自动拉起一次服务, 防止服务意外终止掉. 还可以通过crontab来创建更精确的自动拉起间隔.

以上脚本在SUSE下运行通过, 其他系统的部分命令不一样, 但整体流程应该是差不多的.

参考: http://www.cnblogs.com/bangerlee/archive/2012/03/30/2412652.html

配置程序成为Linux服务的更多相关文章

  1. 树莓派上Java程序作为linux服务并开机自动启动

    http://www.iigrowing.cn/shu_mei_pai_shang_java_cheng_xu_zuo_wei_linux_fu_wu_bing_kai_ji_zi_dong_qi_d ...

  2. Java程序作linux服务并且开机自动启动[转]

    以有个java应用名称为test,打包为test.jar,程序入口为cn.com.ppnote.SocketServer. 下面在linux的/opt下建立testapp目录,复制test.jar到/ ...

  3. 使用Java Service Wrapper将java程序作为linux服务并且开机自动启动

    以java应用程序为例,打包为tianlong.jar,程序入口为tianlong.QueueTest. 下面在linux的/opt下建立tianlong目录,复制tianlong.jar到/opt/ ...

  4. linux程序自启动和新建linux服务的方法

    1 linux创建自启动程序    自启动的两种方法,都经过自己测试.1.1 自启动程序方法1:    在etc/rc.local在里面加入/home/robin/code/autoruntest & ...

  5. linux服务创建及jq配置服务列表查看

    1.应用背景 随着业务需求,后台处理服务不断增多,对于这些服务或后台程序的查看.更新操作越来越凌乱,所以我们首先需要一个服务列表查看工具,方便查看各 服务的端口.运行状态.jar包路径等等. 2.创建 ...

  6. 关于开发微信小程序后端linux使用xampp配置https

    关于开发微信小程序后端linux使用xampp配置https 背景 由于最近开发微信小程序,前后端交互需要使用https协议,故需要配置https服务 服务器环境 服务器系统 ubuntu 环境 xa ...

  7. node.js服务端程序在Linux上持久运行

    如果要想在服务端部署node.js程序,让其持久化运行,就不能单单使用npm start命令运行,当然了,这样运行是毫无问题的,但是当关闭xshell窗口或者是关闭进程的时候(其实关闭xshell窗口 ...

  8. Linux网络配置 RPM命令 samba服务 Linux目录结构

    第一种方法: (1)用root身份登录,运行setup命令进入到 text mode setup utiliy对网络进行配置,这里可以进行ip,子网掩码,默认网关,dns的设置.(2)这时网卡的配置没 ...

  9. linux服务安装与配置(二):安装xinetd服务

    linux服务安装与配置(二):安装xinetd服务 xinetd即extended internet daemon,xinetd是新一代的网络守护进程服务程序,又叫超级Internet服务器.经常用 ...

随机推荐

  1. alex python of day2

      模块 sys模块:sys模块是用c语言写的,所以在lib下是不会有sys.py这个文件存在 1 import sys 2 print(sys.path) #打印环境变量 3 print(sys.a ...

  2. CentOS 7 yum 安装ownCloud 搭建云盘服务器

    基于CentOS7.0 64位系统+ownCloud 10.0 稳定版本构建 ownCloud 是一个开源免费专业的私有云存储项目,它能帮你快速在个人电脑或服务器上架设一套专属的私有云文件同步网盘,可 ...

  3. 用Python写一款属于自己的 简易zip压缩软件 附完成图(适合初学者)

    一.软件描述 用Python tkinter模块写一款属于自己的压缩软件.zip文件格式是通用的文档压缩标准,在ziplib模块中,使用ZipFile来操作zip文件,具有功能:zip压缩功能,zip ...

  4. params SqlParameter[] commandParameters(转)

    C#代码  ExecuteReader(string connectionString, CommandType commandType, string commandText, params Sql ...

  5. python语言 第一个程序

    print("hello word!") # for i in range(1, 10):# for j in range(1, 10):# print(j, "x&qu ...

  6. c语言的枚举(遍历枚举)与数据类型总结

    一.枚举的概念 枚举是C语言中的一种基本数据类型,并不是构造类型,它可以用于声明一组常数.当一个变量有几个固定的可能取值时,可以将这个变量定义为枚举类型. 比如,你可以用一个枚举类型的变量来表示季节, ...

  7. ShoneSharp语言(S#)的设计和使用介绍系列(3)— 修炼工具

    ShoneSharp语言(S#)的设计和使用介绍 系列(3)- 修炼工具 作者:Shone 声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/ShoneSharp. ...

  8. codeforces 893D Credit Card 贪心 思维

    codeforces 893D Credit Card 题目大意: 有一张信用卡可以使用,每天白天都可以去给卡充钱.到了晚上,进入银行对卡的操作时间,操作有三种: 1.\(a_i>0\) 银行会 ...

  9. PHP扩展代码结构详解

    PHP扩展代码结构详解: 这个是继:使用ext_skel和phpize构建php5扩展  内容 (拆分出来) Zend_API:深入_PHP_内核:http://cn2.php.net/manual/ ...

  10. Python的列表

    1. Python的列表简介 1. 1 列表的定义 列表是Python中最基本的数据结构,列表是最常用的Python数据类型,列表的数据项不需要具有相同的类型.列表中的每个元素都分配一个数字 ,即它的 ...