python daemon化你的程序
在之前的树莓派网关项目中遇到了这样一个问题,由于要把网关写的Server持续运行,尤其是要加电自动开启。发现ssh登录开启服务程序之后,当把pty退出时Server端自动断开了,这里想到的APUE中第九章的内容,回顾了下关于会话首进程,进程组,控制终端的概念,所以我们需要把自己写的Server端变为父进程为init(1)的守护进程。
--->首先想到的办法是使用nohup命令,这里遇到一个坑:
当我们用nohup去处理shell脚本时是没有问题的,但是在尝试执行一个Python脚本时:
nohup python tcp_server.py > ser_log.out 2>&1 &
结果很出了问题:竟然查不到重定向的ser_log.out的输出!后来发现:python的输出有缓冲,导致ser_log.out并不能够马上看到输出。
我们应该加 -u参数,使得python不启用缓冲,如下:
nohup python -u tcp_server.py > ser_log.out 2>&1 &
--->其次,结合最近看的Unix网络编程13章、与APUE13章内容,决定自己尝试写一个daemon,把自己的程序daemon化,代码如下:(守护进程的编程规则可以回顾这篇去年写的:http://www.cnblogs.com/webber1992/p/5850747.html)
#!/usr/bin/env python
# coding:utf-8
import os,sys,time def daemon_init(stdin='/dev/null',stdout='/dev/null',stderr='/dev/null'):
sys.stdin = open(stdin,'r')
sys.stdout = open(stdout,'a+')
sys.stderr = open(stderr,'a+')
try:
pid = os.fork()
if pid > 0: #parrent
os._exit(0)
except OSError,e:
sys.stderr.write("first fork failed!!"+e.strerror)
os._exit(1) # 子进程, 由于父进程已经退出,所以子进程变为孤儿进程,由init收养
'''setsid使子进程成为新的会话首进程,和进程组的组长,与原来的进程组、控制终端和登录会话脱离。'''
os.setsid()
'''防止在类似于临时挂载的文件系统下运行,例如/mnt文件夹下,这样守护进程一旦运行,临时挂载的文件系统就无法卸载了,这里我们推荐把当前工作目录切换到根目录下'''
os.chdir("/")
'''设置用户创建文件的默认权限,设置的是权限“补码”,这里将文件权限掩码设为0,使得用户创建的文件具有最大的权限。否则,默认权限是从父进程继承得来的'''
os.umask(0) try:
pid = os.fork() #第二次进行fork,为了防止会话首进程意外获得控制终端
if pid > 0:
os._exit(0) #父进程退出
except OSError,e:
sys.stderr.write("second fork failed!!"+e.strerror)
os._exit(1) # 孙进程
# for i in range(3,64): # 关闭所有可能打开的不需要的文件,UNP中这样处理,但是发现在python中实现不需要。
# os.close(i)
sys.stdout.write("Daemon has been created! with pid: %d\n" % os.getpid())
sys.stdout.flush() #由于这里我们使用的是标准IO,回顾APUE第五章,这里应该是行缓冲或全缓冲,因此要调用flush,从内存中刷入日志文件。 def main():
print '========main function start!============' #在调用daemon_init函数前是可以使用print到标准输出的,调用之后就要用把提示信息通过stdout发送到日志系统中了
daemon_init('/dev/null','/tmp/daemon.log','/tmp/daemon.err') # 调用之后,你的程序已经成为了一个守护进程,可以执行自己的程序入口了
time.sleep(10) #daemon化自己的程序之后,sleep 10秒,模拟阻塞 if __name__ == '__main__':
main()
这样,通过调用daemon_init方法,就可以把自己的程序变为守护进程了,实现了nohup的功能。这样做就更加灵活了,之后的事情就要具体问题具体分析了,比如针对自己实际的应用程序来决定是否要设置umask,是否要关闭不必要的文件描述符,是否要改变当前工作目录等等。
python daemon化你的程序的更多相关文章
- Python flask构建微信小程序订餐系统
第1章 <Python Flask构建微信小程序订餐系统>课程简介 本章内容会带领大家通览整体架构,功能模块,及学习建议.让大家在一个清晰的开发思路下,进行后续的学习.同时领着大家登陆ht ...
- WeCenter 社交化问答社区程序 | WeCenter 是一款知识型的社交化问答社区程序,专注于社区内容的整理、归类、检索和再发行
WeCenter 社交化问答社区程序 | WeCenter 是一款知识型的社交化问答社区程序,专注于社区内容的整理.归类.检索和再发行 为什么选择 WeCenter 程序? 让您的社区更智能地运作,强 ...
- 【纯·技术干货】更 App 化的小程序开发
2018 年 10 月13 日,由又拍云和知晓云联合主办的 Open Talk 丨2018 小程序开发者沙龙系列活动广州站拉开帷幕,糗事百科前端负责人宋航在沙龙上做了<更App化的小程序开发&g ...
- 用python + hadoop streaming 编写分布式程序(一) -- 原理介绍,样例程序与本地调试
相关随笔: Hadoop-1.0.4集群搭建笔记 用python + hadoop streaming 编写分布式程序(二) -- 在集群上运行与监控 用python + hadoop streami ...
- 用python + hadoop streaming 编写分布式程序(二) -- 在集群上运行与监控
写在前面 相关随笔: Hadoop-1.0.4集群搭建笔记 用python + hadoop streaming 编写分布式程序(一) -- 原理介绍,样例程序与本地调试 用python + hado ...
- 用python + hadoop streaming 编写分布式程序(三) -- 自定义功能
又是期末又是实训TA的事耽搁了好久……先把写好的放上博客吧 相关随笔: Hadoop-1.0.4集群搭建笔记 用python + hadoop streaming 编写分布式程序(一) -- 原理介绍 ...
- 使用python操作文件实现购物车程序
使用python操作文件实现购物车程序 题目要求如下: 实现思路 始终维护一张字典,该字典里保存有用户账号密码,购物车记录等信息.在程序开始的时候读进来,程序结束的时候写回文件里去.在登录注册的部分, ...
- 【python学习】新手基础程序练习(二)
Ι 继续上一节得内容,这里主要是对各种知识的理解以及如何运用. 一.执行 Python 脚本的两种方式 1.把python执行文件加到计算机的环境变量中,然后新建文件把程序写在新文件里,再通过cmd命 ...
- python实现自动重启本程序的方法 技术的漩涡
python实现自动重启本程序的方法 http://www.jb51.net/article/69174.htm import requests, time url_l = []with open(' ...
随机推荐
- ajax跨域传值
<script type="text/javascript"> function xmlpage(){ $.ajax({ url:'http://localhost/3 ...
- Git 基础再学习之:git checkout -- file
首先明白一下基本概念和用法,这段话是从前在看廖雪峰的git教程的时候摘到OneNote的 准备工作: 新建了一个learngit文件夹,在bash中cd进入文件夹,用以下命令创建一个仓库. $ git ...
- WHU 1572 Cyy and Fzz (AC自动机 dp )
题意: 给出n个串,求任意长度为m的字符串包含串的个数的期望.(n<=8,m<=14,给定串的长度不超过12). Solution: 首先可以想到应该用概率DP,我们需要至少3维,dp[i ...
- 【POJ2761】【fhq treap】A Simple Problem with Integers
Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...
- php开发利器
phpstorm 当前版本2016.1 之前用的为Zend studio,比之notepad++确实方便很多,不过很多方面还是不方便的,比如定位文件,上传下载到svn什么的. 看到phpstorm新版 ...
- K - 计算球体积
Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description 根据输入的 ...
- 开发DZ插件教程
插件制作的基本思路是:(初学者适用)1.形成插件思路2.制作插件界面3.构架程序模块4.搭建存储数据5.填充功能语句6.检查应用错误7.完善插件功能 前言:为方便互联网数万Discuz!爱好者,更加深 ...
- 屏蔽手势UIGestureRecognizer 先后响应
在iOS5一下对于手势的识别能力并不强,比如iOS6上面按钮的一个tap事件,最先接收的是uiview,并相应,而不是最上面的button,这时候就需要判断手势所在的位置和手势所在的控制器了 如下例子 ...
- sdk manager更新失败,显示Download interrupted: read timed out,应该如何解决?
今天开始第一天学习Android,就遇到一个大问题.sdk manager无法自动更新,总在提示超时!!! 经过网上查询发现问题原因是. 在利用android sdk manager更新时失败,具体情 ...
- Unity3D Quaternion各属性和函数测试
Quaternion属性与方法 一,属性: x.y.z就不说了,只看一个eulerAngles,代码如下: public Quaternion rotation = Quaternion.identi ...