引言

在上一篇《Linux启动之旅》中,我们了解了Linux启动过程,在该过程的最后一步,init进程拉起/etc/init.d/rcN.d/目录下指定的守护进程(daemon)。假若自定义的一个进程也需要随开机自启动,并随系统一直运行,我们可以怎么设置呢?

利用init进行进程托管

系统启动时,init程序根据/etc/inittab文件的配置,拉起系统服务、getty登陆终端,自定义的进程同样也可交由init程序管理。

最简单的方法,是在/etc/inittab文件中添加一条语句:

zz:2345:respawn:/tmp/lx/test_init

该语句含义为:

id: inittab文件中条目的唯一标识,这里为zz

runlevels: 列出指定命令或进程的运行级,这里指示/tmp/lx/test_init程序在2、3、4和5级别运行

action: 描述init对进程进行何种方式托管,respawn指该进程只要中止就立即重新启动

process: 要执行的进程,这里为/tmp/lx/test_init

对/etc/inittab文件修改过后,我们可发送HUP信号量给init进程,让修改生效:

#kill  -HUP  

以上命令执行完之后,就可以查到我们自定义的程序咯:

SER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND root      3783  0.0  0.0   3832   600 ?        Ss   Mar27   0:00 /tmp/lx/test_init

init是否能像我们设定的那样对自定义进程进行管理呢?kill掉以上进程再检验一下吧!

这种设定自启动、长久执行进程的方式十分简单,所要做的就是把程序准备好,再在/etc/inittab文件里添加一条语句即可。但是,如果要把进程停掉,我们需要这么做:修改/etc/inittab文件,在对应条目开头加上注释,然后发送SIGHUP信号让init进程重新加载/etc/inittab配置文件。

这时,在一旁扫地的阿姨瞄了一眼屏幕,不经意地说:停止进程就这么不方便,假如我还要重启进程、查询进程状态、修改进程运行级别呢?

守护进程设置

为更方便地对自定义进程进行起停、查询等操作,我们可将自定义进程设置为守护进程,并利用service等工具进行进程管理工作。下面我们来看守护进程的设置方法。

首先,和系统自带的守护进程一样,在/etc/init.d目录下需要有一个与自定义守护进程相对应的脚本文件(init script),该脚本包含以下内容。

说明信息(INIT INFO):

# /etc/init.d/test_daemon ### BEGIN INIT INFO # Provides:           test_daemon # Required-Start:     $local_fs  # Should-Start:  # Required-Stop:  # Should-Stop:  # Default-Start:      2 3 5 # Default-Stop:       0 1 2 6 # Description:        test_daemon writes a message to /tmp/lx/test.log every 10 seconds,
#                     showing that the daemon is alive.
### END INIT INFO

守护进程的说明信息格式固定,其指明守护进程依赖的服务、启动/关闭的运行级别等信息。

进程开启(start)、退出(stop)、状态查询(status)等动作对应的脚本:

TEST_BIN=/usr/sbin/test_daemon case "$1" in start) echo -n "Starting test_daemon " /sbin/startproc $TEST_BIN rc_status -v ;; stop) echo -n "Shutting down test_daemon " /sbin/killproc -TERM $TEST_BIN rc_status -v ;;

以上脚本调用了startproc、killproc工具对守护进程的起停进行控制。

最后,正确设置脚本权限,并使用insserv工具生成/etc/init.d/rcN.d目录下相应链接:

#chmod 744 /etc/init.d/test_daemon #insserv /etc/init.d/test_daemon

insserv工具会根据守护进程init script中"INIT INFO"的依赖信息,决定系统启动时,自定义守护进程与已有守护进程的相对启动顺序:

#ll /etc/init.d/rc5.d/*test lrwxrwxrwx 1 root root 7 Mar 29 01:02 /etc/init.d/rc5.d/K01test_daemon -> ../test_daemon lrwxrwxrwx 1 root root 7 Mar 29 01:02 /etc/init.d/rc5.d/S01test_daemon -> ../test_daemon

完成以上步骤,在系统重启后,进程test_daemon就会自动启动。我们可以使用命令对该进程进行起停:

#/etc/init.d/test_daemon start Starting test_daemon                   done #/etc/init.d/test_daemon status Checking for service test_daemon       running #/etc/init.d/test_daemon stop Shutting down test_daemon              done

service工具可对/etc/init.d目录下的系统服务进行管理,也可以使用它完成与以上相同的操作:

#service test_daemon start #service test_daemon status #service test_daemon stop

另外,我们还可以使用chkconfig工具对test_daemon的启动级别进行查询和设定:

#chkconfig --list | grep test_daemon test_daemon 0:off 1:off 2:on 3:on 4:off 5:on 6:off #chkconfig test_daemon 35 #chkconfig --list | grep test test 0:off 1:off 2:off 3:on 4:off 5:on 6:off

小结

本文介绍了两种添加自定义后台进程的方法。将进程交由init托管,当进程退出时可被init重新拉起,设置方法简单,但不方便对进程进行管理;以init script的方式将进程设置为系统服务项,利用系统已有的服务项管理工具service、chkconfig,能方便地对进程进行管理。

本文中使用的自定义进程代码和相关脚本可从这里下载。

Linux进程托管与守护进程设置的更多相关文章

  1. Linux编程之《守护进程》

    Intro ----- 守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程常 ...

  2. Linux 下Qt实现守护进程实例(转)

     原文地址:Linux守护进程的编程方法(含实例) 作者:lingdxuyan 参考文献 Linux信号列表(zz) Linux 守护进程的编程方法 linux上编写守护进程的例程 Linux下后台守 ...

  3. Linux下一个简单守护进程的实现 (Daemon)

    在Linux/UNIX系统引导的时候会开启很多服务,这些服务称为守护进程(也叫Daemon进程).守护进程是脱离于控制终端并且在后台周期性地执行某种任务或等待处理某些事件的进程,脱离终端是为了避免进程 ...

  4. 一只简单的网络爬虫(基于linux C/C++)————守护进程

    守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程常常在系统引导装入时启动, ...

  5. (七) 一起学 Unix 环境高级编程(APUE) 之 进程关系 和 守护进程

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  6. python开发 *进程数据隔离.守护进程,进程同步工具 * 180725

    进程数据隔离.守护进程,进程同步工具 一.进程之间的数据隔离: from multiprocessing import Process n=100 #主程序中变量n= def func(): glob ...

  7. Python 之并发编程之进程中(守护进程(daemon)、锁(Lock)、Semaphore(信号量))

    五:守护进程 正常情况下,主进程默认等待子进程调用结束之后再结束守护进程在主进程所有代码执行完毕之后,自动终止kill -9 进程号 杀死进程.守护进程的语法:进程对象.daemon = True设置 ...

  8. Linux进程实践(5) --守护进程

    概述 守护进程是在需要在后台长期运行不受终端控制的进程,通常情况下守护进程在系统启动时自动运行,在服务器关闭的时候自动关闭:守护进程的名称通常以d结尾,比如sshd.xinetd.crond.atd等 ...

  9. Linux系统编程之--守护进程的创建和详解【转】

    本文转载自:http://www.cnblogs.com/mickole/p/3188321.html 一,守护进程概述 Linux Daemon(守护进程)是运行在后台的一种特殊进程.它独立于控制终 ...

随机推荐

  1. Web项目--------原Oracle数据库的项目同时兼容MySql

    原Oracle数据库的项目同时兼容MySql步骤: (一)修改资源配置文件applicationContext-dataSource.xml的数据库连接 Oracle数据库中加上from dual的原 ...

  2. 微信 小程序组件 加入购物车全套 one js

    // pages/shop/shop.js Page({ /** * 页面的初始数据 */ data: { carts: [ { teaname: '冠军乌龙茶-150g', image: '../. ...

  3. 02 使用Mybatis的逆向工程自动生成代码

    1.逆向工程的作用 Mybatis 官方提供了逆向工程,可以针对数据库表自动生成Mybatis执行所需要的代码(包括mapper.xml.Mapper.java.pojo). 2.逆向工程的使用方法 ...

  4. 【刷题】BZOJ 1823 [JSOI2010]满汉全席

    Description 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只有极少數博学多闻技艺高超的厨师能够做出满汉全席,而 ...

  5. 【Luogu P4149】[IOI2011]Race(点分治)

    自闭了几天后的我终于开始做题了..然后调了3h一道点分治板子题,调了一天一道IOI... 最后还是自己手造数据debug出来的... 这题一看:树上路径问题,已知路径长度求balabala,显然是点分 ...

  6. 解题:HNOI 2013 Cards

    题面 除了不洗牌以外,每种洗牌方式的每个循环里的颜色必须一样,然后大力背包一下就好了.最后记得把不洗牌的方案也算进去 #include<cstdio> #include<cstrin ...

  7. CRT && exCRT模板

    CRT从各种方面上都吊打exCRT啊...... 短,好理解... 考虑构造bi使得bi % pi = ai,bi % pj = 0.然后全加起来就行了. 显然bi的构造就是ai * (P/pi) * ...

  8. 关于 Java 中的 Null

    什么是Java中的Null? null在Java中是一个非常重要的概念,它最初是为了表示缺少某些东西,例如缺少用户.资源或任何东西而发明出来的.但是这也为Java程序员带来了很多麻烦,比如最常见的空指 ...

  9. Kubernetes Service

    目录 基本概念 服务发现与负载均衡 配置Service 创建一个ClusterIP类型的Service 创建一个指定ClusterIP的Service 创建一个headless service 创建一 ...

  10. CSS Counter Style试玩儿

    2015年2月3日,CSS Counter Style level3成为了W3C的候选标准,是时候来一探究竟,看看强大魔力的@counter-style如何自定义list-style和counter. ...