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 相关文章推荐
JavaScript面象对象设计
Apr 28 Javascript
jQuery 打造动态渐变按钮 详细图文教程
Apr 25 Javascript
jQuery 1.5.1 发布,全面支持IE9 修复大量bug
Feb 26 Javascript
Node.js(安装,启动,测试)
Jun 09 Javascript
Jquery对select的增、删、改、查操作
Feb 06 Javascript
Jquery异步提交表单代码分享
Mar 26 Javascript
剖析Node.js异步编程中的回调与代码设计模式
Feb 16 Javascript
jquery实现全选、不选、反选的两种方法
Sep 06 Javascript
JS仿Base.js实现的继承示例
Apr 07 Javascript
详解Angular结合zTree异步加载节点数据
Jan 20 Javascript
详解JavaScript作用域、作用域链和闭包的用法
Sep 03 Javascript
JS删除对象中某一属性案例详解
Sep 08 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
收听困难?教您超简便短波广播抗干扰方法!
2021/03/01 无线电
php 之 没有mysql支持时的替代方案
2006/10/09 PHP
PHP 杂谈《重构-改善既有代码的设计》之三 重新组织数据
2012/04/09 PHP
根据中文裁减字符串函数的php代码
2013/12/03 PHP
PHP屏蔽过滤指定关键字的方法
2014/11/03 PHP
PHP+MySQL修改记录的方法
2015/01/21 PHP
php三元运算符知识汇总
2015/07/02 PHP
laravel5.1框架model类查询的实现方法
2019/10/08 PHP
javascript 防止刷新,后退,关闭
2010/08/07 Javascript
nodejs 后缀名判断限制代码
2011/03/31 NodeJs
jQuery源码分析-03构造jQuery对象-工具函数
2011/11/14 Javascript
javascript数组操作(创建、元素删除、数组的拷贝)
2014/04/07 Javascript
js实现精美的图片跟随鼠标效果实例
2015/05/16 Javascript
jQuery解析json格式数据简单实例
2016/01/22 Javascript
javascript的 {} 语句块详解
2016/02/27 Javascript
Flask中获取小程序Request数据的两种方法
2017/05/12 Javascript
详解如何构建Angular项目目录结构
2017/07/13 Javascript
修改UA在PC中访问只能在微信中打开的链接方法
2017/11/27 Javascript
JS严格模式知识点总结
2018/02/27 Javascript
JavaScript中的ES6 Proxy的具体使用
2019/06/16 Javascript
vue(2.x,3.0)配置跨域代理
2019/11/27 Javascript
Python内置模块turtle绘图详解
2017/12/09 Python
python中scikit-learn机器代码实例
2018/08/05 Python
python自定义函数实现一个数的三次方计算方法
2019/01/20 Python
利用Pandas和Numpy按时间戳将数据以Groupby方式分组
2019/07/22 Python
基于h5py的使用及数据封装代码
2019/12/26 Python
python 如何调用 dubbo 接口
2020/09/24 Python
财务学生的职业生涯发展
2014/02/11 职场文书
房屋租赁意向书
2014/04/01 职场文书
工商管理专业自荐信
2014/06/03 职场文书
酒店服务员岗位职责
2015/02/09 职场文书
银行自荐信范文
2015/03/25 职场文书
python实现黄金分割法的示例代码
2021/04/28 Python
分享五个Node.js开发的优秀实践 
2022/04/07 NodeJs
详解Go语言中配置文件使用与日志配置
2022/06/01 Golang
使用opencv-python如何打开USB或者笔记本前置摄像头
2022/06/21 Python