引言

在上一篇《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. SDN可靠性相关

    A subtree-based approach to failure detection and protection for multicast in SDN FRONTIERS OF INFOR ...

  2. MongoDB ,cursor not found异常

    查询mongoDB集合数据更新,数据有400w多.我一次用cursor(游标)取1w,处理更新.程序在某段时间运行中遍历游标时发生异常! DBCursor cursor = tabColl.find( ...

  3. asp.net简述Web Forms开发模式

    详情请查阅:http://www.runoob.com/aspnet/aspnet-intro.html 1.Web Forms 是三种创建 ASP.NET 网站和 Web 应用程序的编程模式中的一种 ...

  4. 【设计模式】——抽象工厂Abstract Factory

    模式意图 提供对象的使用接口,隐藏对象的创建过程. 模式结构 AbstractFactory 提供创建对象的接口. ConcreteFactory 提供真正创建对象的实现类,用于组合并创建不同的对象, ...

  5. linux课外命令

    1.要知道linux是多少位的 在命令行输入 getconf LONG_BIT 返回32就是32位,返回64就是64位的. 2.CentOS-7-x86_64-DVD-1708.iso 这种代表64位 ...

  6. BZOJ2597 WC2007剪刀石头布(费用流)

    考虑使非剪刀石头布情况尽量少.设第i个人赢了xi场,那么以i作为赢家的非剪刀石头布情况就为xi(xi-1)/2种.那么使Σxi(xi-1)/2尽量小即可. 考虑网络流.将比赛建成一排点,人建成一排点, ...

  7. Java 基本数据类型 sizeof 功能

    Java 基本数据类型 sizeof 功能 来源 https://blog.csdn.net/ithomer/article/details/7310008 Java基本数据类型int     32b ...

  8. String args[] 和 String[] args 有什么区别

    String args[] 和 String[] args 有什么区别 public static void main(String args[]) 或 public static void main ...

  9. 洛谷P3380 【模板】二逼平衡树(树套树,树状数组,线段树)

    洛谷题目传送门 emm...题目名写了个平衡树,但是这道题的理论复杂度最优解应该还是树状数组套值域线段树吧. 就像dynamic ranking那样(蒟蒻的Sol,放一个link骗访问量233) 所有 ...

  10. POJ 2135 Farm Tour (网络流,最小费用最大流)

    POJ 2135 Farm Tour (网络流,最小费用最大流) Description When FJ's friends visit him on the farm, he likes to sh ...