记得刚入职的时候,那时候什么都不懂,组长让我跑个迁移程序,还没跑完就关终端走人了,结果可想而知,那是第一次知道守护进程的概念。
当时后来是加了nohup参数解决的,
nohup ./program &
但是总是强迫别人用nohup来启动自己的程序毕竟不是办法,所以还是要把自己的进程变成守护进程才行。

C/C++的版本就不说了,这里有篇文章写的很清楚。
http://colding.bokee.com/5277082.html

这里主要介绍一下在网上无意发现的一个国外哥们的写的python版本:
http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/
顺便吐个槽,这哥们用的Vim配色明显是Wombat~~
代码如下(对私有函数名加了_前缀,便于理解,并加了一定的注释):


简单解释一下,整个类实现的功能:

1.进程脱离父进程及终端绑定

2.进程唯一性保证

3.标准输入/输出/错误重定向

附:

源代码下载

OK,就这样~

暂无相关产品

21则回应给“用python编写Linux守护进程”

  1. GlacJAY说道:

    在 PyPI 里面有现成的库的,我用过的是 python-daemon 。

    [回复]

    Dante 回复:

    去看了一下,果然是有现成的库的,多谢~~

    [回复]

  2. 雨碎江南说道:

    …守护进程…
    话说我正在和sbin/init作斗争.

    [回复]

  3. 可可火山说道:

    对于这个事情我看了 《让进程在后台可靠运行的几种方法》 有了比较全面的理解
    http://www.ibm.com/developerworks/cn/linux/l-cn-nohup/

    平时工作都用screen。
    python刚开始,学习了。python库太多?有标准么

    [回复]

    Dante 回复:

    嗯,去看了一下那个链接,确实讲的更深刻一些。。。
    python的话,pypi上面的库应该就算比较正式的了~

    [回复]

  4. blankyao说道:

    博主是啥部门的?好像是同事,呵呵

    [回复]

    Dante 回复:

    呵呵,互联网的~~看了你的资料,应该也是互联网的吧~~

    [回复]

  5. GuoJing说道:

    不错,这个得支持一下。正准备写python后台运行的程序呢。

    [回复]

    Dante 回复:

    呵呵,羡慕啊,在douban可以用这么优雅的语言写程序~

    [回复]

  6. yogoloth说道:

    其实关键就是setsid

    [回复]

    Dante 回复:

    嗯,不过考虑了更多的细节~
    把unix环境编程所要求的5点都实现了。

    [回复]

  7. Zealot Ke说道:

    start时建议加上这个检查:os.kill(pid, 0),确认pid对应的进程确实存在,没有异常死掉。
    p.s. man 2 kill
    “If sig is 0, then no signal is sent, but error checking is still performed; this can be used to check for the
    existence of a process ID or process group ID.”

    [回复]

    依云 回复:

    原来用 kill 就可以判断进程是否存在啊~学习了~~

    [回复]

    妞妞 回复:

    同样学习了

    [回复]

    Dante 回复:

    的确的确,包括线程也是可以通过:
    pthread_kill_err = pthread_kill(*it,0);
    来判断是否死亡的~
    if(pthread_kill_err == ESRCH)
    {
    ERROR_LOG(“ID为0x%x的线程不存在或者已经退出。\n”,(unsigned int)*it);
    }

    [回复]

  8. cc说道:

    nohup 启动 python 脚本为 daemon

    会不会导致
    no job control in this shell
    bg, fg …
    无法使用呢?

    [回复]

  9. cc说道:

    我意思是:
    nohup 会不会没有完全脱离当前终端 …
    导致终端占用,从而导致 no job control

    [回复]

    Dante 回复:

    应该是完全脱离了的,你可以ps -ef 看进程的状态,是没有tty的。

    [回复]

    cc 回复:

    开机自启动 /etc/init.d/test
    完全脱离 tty

    开机后手动启动没有脱离,总有tty or pts/*

    [回复]

  10. [...] Daemon部分在网上搜一下,有现成可用的示例。比如vimer的blog上的这一篇,我这里基本就是套用这个模式的。中间出了一些小问题,主要是对python类中的_和__认识不清楚造成的,_相当于protect,子类可以访问,__相当于private,子类是继承不了的。其它的没有什么问题,然后就是在run函数中写自己的逻辑了,这里我们用到了子进程池,python在multiprocessing包中提供了Pool来帮助我们实现这一点。需要注意的是,给子进程的函数句柄不能是类内部的,最好是使用def funcName(param)方式定义的,这里涉及了一个pickle问题,具体可以查一下python的手册,我看得也不是很明白,只知道是和函数的存储以及多进程访问有关。子进程池的简单示例如下: [...]

  11. 包菜兄说道:

    我怎么觉得这样的叫做脱离终端进程,没有守护呀。

    [回复]

发表评论