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 相关文章推荐
Iframe thickbox2.0使用的方法
Mar 05 Javascript
Javascript 中的类和闭包
Jan 08 Javascript
Javascript学习笔记二 之 变量
Dec 15 Javascript
用Javascript实现Windows任务管理器的代码
Mar 27 Javascript
javascript拖拽上传类库DropzoneJS使用方法
Dec 05 Javascript
js定时调用方法成功后并停止调用示例
Apr 08 Javascript
JQuery EasyUI 数字格式化处理示例
May 05 Javascript
使用VS开发 Node.js指南
Jan 06 Javascript
js使用心得分享
Jan 13 Javascript
jquery实现移动端点击图片查看大图特效
Sep 11 Javascript
详解webpack进阶之插件篇
Jul 06 Javascript
vue实现桌面向网页拖动文件的示例代码(可显示图片/音频/视频)
Mar 01 Vue.js
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
phpwind中的数据库操作类
2007/01/02 PHP
PHP5 操作MySQL数据库基础代码
2009/09/29 PHP
PHP实现的进度条效果详解
2016/05/03 PHP
Laravel中前端js上传图片到七牛云的示例代码
2017/09/04 PHP
PHP生成推广海报的方法分享
2018/04/22 PHP
Js切换功能的简单方法
2010/11/23 Javascript
JavaScript插入动态样式实现代码
2012/02/22 Javascript
JavaScript高级程序设计(第3版)学习笔记10 再访js对象
2012/10/11 Javascript
js中使用replace方法完成某个字符的转换
2014/08/20 Javascript
JavaScript定义变量和变量优先级问题探讨
2014/10/11 Javascript
js与jquery分别实现tab标签页功能的方法
2016/11/18 Javascript
Angular ng-repeat遍历渲染完页面后执行其他操作详细介绍
2016/12/13 Javascript
js数字舍入误差以及解决方法(必看篇)
2017/02/28 Javascript
将 vue 生成的 js 上传到七牛的实例
2017/07/28 Javascript
浅谈React中的元素、组件、实例和节点
2018/02/27 Javascript
基于vue中解决v-for使用报红并出现警告的问题
2018/03/03 Javascript
详解Vue取消eslint语法限制
2018/08/04 Javascript
iview的table组件自带的过滤器实现
2019/07/12 Javascript
微信小程序图片左右摆动效果详解
2019/07/13 Javascript
Vue+Element实现网页版个人简历系统(推荐)
2019/12/31 Javascript
file-loader打包图片文件时路径错误输出为[object-module]的解决方法
2020/01/03 Javascript
JS实现判断移动端PC端功能
2020/02/21 Javascript
[29:10]Ti4 冒泡赛第二天 NEWBEE vs Titan 3
2014/07/15 DOTA
[02:42]完美大师赛主赛事淘汰赛第三日观众采访
2017/11/25 DOTA
Python中获取网页状态码的两个方法
2014/11/03 Python
Python计算两个日期相差天数的方法示例
2017/05/23 Python
用virtualenv建立多个Python独立虚拟开发环境
2017/07/06 Python
python 信息同时输出到控制台与文件的实例讲解
2018/05/11 Python
Pycharm取消py脚本中SQL识别的方法
2018/11/29 Python
Pandas时间序列:重采样及频率转换方式
2019/12/26 Python
python中reload重载实例用法
2020/12/15 Python
python学习之使用Matplotlib画实时的动态折线图的示例代码
2021/02/25 Python
2015年幼儿园新年寄语
2014/12/08 职场文书
护士自我推荐信范文
2015/03/24 职场文书
公司2015年终工作总结
2015/05/26 职场文书
幼儿园开学温馨提示
2015/07/15 职场文书