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与CSS复习(三)
Jun 29 Javascript
jQuery 1.5 源码解读 面向中高阶JSER
Apr 05 Javascript
解析页面加载与js函数的执行 onload or ready
Dec 12 Javascript
利用JS提交表单的几种方法和验证(必看篇)
Sep 17 Javascript
微信小程序 详解下拉加载与上拉刷新实现方法
Jan 13 Javascript
webpack实现热更新(实施同步刷新)
Jul 28 Javascript
在vue中使用Autoprefixed的方法
Jul 27 Javascript
微信网页授权并获取用户信息的方法
Jul 30 Javascript
vue实现PC端录音功能的实例代码
Jun 05 Javascript
React传值 组件传值 之间的关系详解
Aug 26 Javascript
微信用户访问小程序的登录过程详解
Sep 20 Javascript
详解Angular Karma测试的持续集成实践
Nov 15 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
PHP的FTP学习(二)[转自奥索]
2006/10/09 PHP
第九节 绑定 [9]
2006/10/09 PHP
joomla jce editor 解决上传中文名文件失败问题
2013/06/09 PHP
wordpress安装过程中遇到中文乱码的处理方法
2015/04/21 PHP
php车辆违章查询数据示例
2016/10/14 PHP
php常用数组函数实例小结
2016/12/29 PHP
IIS 7.5 asp Session超时时间设置方法
2017/04/17 PHP
laravel 实现设置时区的简单方法
2019/10/10 PHP
jQuery 相关控件的事件操作分解
2009/08/03 Javascript
javascript小数四舍五入多种方法实现
2012/12/23 Javascript
jquery.cookie.js使用指南
2015/01/05 Javascript
jQuery实现根据类型自动显示和隐藏表单
2015/03/18 Javascript
对JavaScript的全文搜索实现相关度评分的功能的方法
2015/06/24 Javascript
JS实现的图片预览插件与用法示例【不上传图片】
2016/11/25 Javascript
解决同一页面中两个iframe互相调用jquery,js函数的方法
2016/12/12 Javascript
JavaScript之Canvas_动力节点Java学院整理
2017/07/04 Javascript
使用JS组件实现带ToolTip验证框的实例代码
2017/08/23 Javascript
webpack打包并将文件加载到指定的位置方法
2018/02/22 Javascript
vue路由拦截及页面跳转的设置方法
2018/05/24 Javascript
记录一次完整的react hooks实践
2019/03/11 Javascript
使用element-ui table expand展开行实现手风琴效果
2019/03/15 Javascript
js验证身份证号码记录的方法
2019/04/26 Javascript
python抓取京东价格分析京东商品价格走势
2014/01/09 Python
tensorflow训练中出现nan问题的解决
2018/02/10 Python
tensorflow 获取变量&打印权值的实例讲解
2018/06/14 Python
python计算两个数的百分比方法
2018/06/29 Python
python实现文件的备份流程详解
2019/06/18 Python
通过python扫描二维码/条形码并打印数据
2019/11/14 Python
python判断变量是否为int、字符串、列表、元组、字典的方法详解
2020/02/13 Python
青年志愿者事迹材料
2014/02/07 职场文书
区级文明单位申报材料
2014/05/15 职场文书
公司踏青活动方案
2014/08/16 职场文书
横空出世观后感
2015/06/09 职场文书
党组织结对共建协议书
2016/03/23 职场文书
python flask开发的简单基金查询工具
2021/06/02 Python
Nginx实现负载均衡的项目实践
2022/03/18 Servers