Python脚本后台运行的几种方式


Posted in Javascript onMarch 09, 2015

一个用python写的监控脚本test1.py,用while True方式一直运行,在ssh远程(使用putty终端)时通过以下命令启动脚本:

python test1.py &

现在脚本正常运行,通过ps能看到进程号,此时直接关闭ssh终端(不是用exit命令,是直接通过putty的关闭按钮执行的), 再次登录后发现进程已经退出了。

通过后台启动的方式该问题已经解决,这里总结下,也方便我以后查阅。

linux 下后台运行

通过fork实现
linux环境下,在c中守护进程是通过fork方式实现的,python也可以通过该方式实现,示例代码如下:

#!/usr/bin/env python

import time,platform

import os
def funzioneDemo():

    # 这是具体业务函数示例

    fout = open('/tmp/demone.log', 'w')

    while True:

        fout.write(time.ctime()+'\n')

        fout.flush()

        time.sleep(2)

    fout.close()
def createDaemon():

    # fork进程        

    try:

        if os.fork() > 0: os._exit(0)

    except OSError, error:

        print 'fork #1 failed: %d (%s)' % (error.errno, error.strerror)

        os._exit(1)    

    os.chdir('/')

    os.setsid()

    os.umask(0)

    try:

        pid = os.fork()

        if pid > 0:

            print 'Daemon PID %d' % pid

            os._exit(0)

    except OSError, error:

        print 'fork #2 failed: %d (%s)' % (error.errno, error.strerror)

        os._exit(1)

    # 重定向标准IO

    sys.stdout.flush()

    sys.stderr.flush()

    si = file("/dev/null", 'r')

    so = file("/dev/null", 'a+')

    se = file("/dev/null", 'a+', 0)

    os.dup2(si.fileno(), sys.stdin.fileno())

    os.dup2(so.fileno(), sys.stdout.fileno())

    os.dup2(se.fileno(), sys.stderr.fileno())
    # 在子进程中执行代码

    funzioneDemo() # function demo
if __name__ == '__main__': 

    if platform.system() == "Linux":

        createDaemon()

    else:

        os._exit(0)

通过upstart方式实现
 

可以通过upstart把应用封装成系统服务,这里直接记录下完整示例。

1、编写python脚本

[root@local t27]# cat test123.py

#!/usr/bin/env python
import os,time
while True :

    print time.time()

    time.sleep(1)

2、编写upstat配置文件
[root@local t27]# cat /etc/init/mikeTest.conf

description "My test"

author "Mike_Zhang@live.com"
start on runlevel [234]

stop on runlevel [0156]
chdir /test/t27

exec /test/t27/test123.py

respawn

3、重新加载upstate
initctl reload-configuration

4、启动服务
[root@local t27]# start mikeTest

mikeTest start/running, process 6635

[root@local t27]# ps aux | grep test123.py

root      6635  0.0  0.0  22448  3716 ?        Ss   09:55   0:00 python /test/t27/test123.py

root      6677  0.0  0.0 103212   752 pts/1    S+   09:56   0:00 grep test123.py

5、停止服务
[root@local t27]# stop mikeTest

mikeTest stop/waiting

[root@local t27]# ps aux | grep test123.py

root      6696  0.0  0.0 103212   752 pts/1    S+   09:56   0:00 grep test123.py

[root@local t27]#

通过bash脚本实现

1、python代码

[root@local test]# cat test123.py

#!/usr/bin/env python
import os,time
while True :

    print time.time()

    time.sleep(1)

2、编写启动脚本
[root@local test]# cat start.sh

#! /bin/sh
python test123.py &

3、启动进程
[root@local test]#./start.sh

如果直接用&启动进程:
python test123.py &

直接关闭ssh终端会导致进程退出。

通过screen、tmux等方式实现

如果临时跑程序的话,可以通过screen、tmux启动程序,这里描述下tmux启动的方式。

1、启动tmux

在终端输入tmux即可启动

2、在tmux中启动程序

直接执行如下命令即可(脚本参考上面的): python test123.py

3、直接关闭ssh终端(比如putty上的关闭按钮);

4、重新ssh上去之后,执行如下命令:

tmux attach

现在可以看到python程序还在正常执行。

windows下后台运行

在windows下没有深入的研究过,我经常用的方法是修改python脚本的扩展名为".pyw",双击即可后台运行,不需要修改任何代码。

Javascript 相关文章推荐
js DOM 元素ID就是全局变量
Sep 20 Javascript
JQuery中层次选择器用法实例详解
May 18 Javascript
通过点击jqgrid表格弹出需要的表格数据
Dec 02 Javascript
jQuery禁用键盘后退屏蔽F5刷新及禁用右键单击
Jan 22 Javascript
Node.js利用Net模块实现多人命令行聊天室的方法
Dec 23 Javascript
Vue系列:通过vue-router如何传递参数示例
Jan 16 Javascript
移动端利用H5实现压缩图片上传功能
Mar 29 Javascript
你可能不知道的前端算法之文字避让(inMap)
Jan 12 Javascript
基于angular6.0实现的一个组件懒加载功能示例
Apr 12 Javascript
对angularJs中controller控制器scope父子集作用域的实例讲解
Oct 08 Javascript
three.js着色器材质的内置变量示例详解
Aug 16 Javascript
OpenLayers3实现鼠标移动显示坐标
Sep 25 Javascript
JS控制表格实现一条光线流动分割行的方法
Mar 09 #Javascript
JS实现点击按钮自动增加一个单元格的方法
Mar 09 #Javascript
JS实现网页表格自动变大缩小的方法
Mar 09 #Javascript
EasyUI中datagrid在ie下reload失败解决方案
Mar 09 #Javascript
JS控制网页动态生成任意行列数表格的方法
Mar 09 #Javascript
jQuery随机密码生成的方法
Mar 09 #Javascript
jQuery实现简单的间隔向上滚动效果
Mar 09 #Javascript
You might like
dedecms 制作模板中使用的全局标记图文教程
2007/03/11 PHP
php 动态执行带有参数的类方法
2009/04/10 PHP
php实现上传图片生成缩略图示例
2014/04/13 PHP
PHP函数addslashes和mysql_real_escape_string的区别
2014/04/22 PHP
6个超实用的PHP代码片段
2015/08/10 PHP
javascript radio 联动效果
2009/03/04 Javascript
firefo xml 读写实现js代码
2009/06/11 Javascript
javascript字符串拼接的效率问题
2010/12/25 Javascript
基于mootools插件实现遮罩层新手引导
2012/05/24 Javascript
JavaScript给按钮绑定点击事件(onclick)的方法
2015/04/07 Javascript
浅析jQuery事件之on()方法绑定多个选择器,多个事件
2016/04/27 Javascript
js 判断各种数据类型的简单方法(推荐)
2016/08/29 Javascript
js, jQuery实现全选、反选功能
2017/03/08 Javascript
详解vuelidate 对于vueJs2.0的验证解决方案
2017/03/09 Javascript
详解es6超好用的语法糖Decorator
2018/08/01 Javascript
JS简单判断是否在微信浏览器打开的方法示例
2019/01/08 Javascript
Vue动态生成el-checkbox点击无法赋值的解决方法
2019/02/21 Javascript
JavaScript如何实现元素全排列实例代码
2019/05/14 Javascript
vue 兄弟组件的信息传递的方法实例详解
2019/08/30 Javascript
Vue页面跳转传递参数及接收方式
2020/09/09 Javascript
python list排序的两种方法及实例讲解
2017/03/20 Python
Python实现嵌套列表及字典并按某一元素去重复功能示例
2017/11/30 Python
python批量爬取下载抖音视频
2019/06/17 Python
python调用动态链接库的基本过程详解
2019/06/19 Python
Flask 上传自定义头像的实例详解
2020/01/09 Python
python列表推导和生成器表达式知识点总结
2020/01/10 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
2020/03/30 Python
keras的siamese(孪生网络)实现案例
2020/06/12 Python
漫威玩具服装及周边商品官方购物网站:Marvel Shop
2019/05/11 全球购物
骨干教师培训感言
2014/01/16 职场文书
《长城》教学反思
2014/02/14 职场文书
高中微机老师自我鉴定
2014/02/16 职场文书
2015年社区计生工作总结
2015/04/21 职场文书
社区节水倡议书
2015/04/29 职场文书
通用员工手册范本
2015/05/14 职场文书
2016小学新学期寄语
2015/12/04 职场文书