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 相关文章推荐
IE iframe的onload方法分析小结
Jan 07 Javascript
bgsound 背景音乐 的一些常用方法及特殊用法小结
May 11 Javascript
Jquery Select操作方法集合脚本之家特别版
May 17 Javascript
基于JQuery的6个Tab选项卡插件
Sep 03 Javascript
JQuery与Ajax调用新浪API获取短网址的代码
Feb 07 Javascript
jQuery循环动画与获取组件尺寸的方法
Feb 02 Javascript
[原创]Bootstrap 中下拉菜单修改成鼠标悬停直接显示
Apr 14 Javascript
微信小程序实现图片预加载组件
Jan 18 Javascript
Vue.js学习教程之列表渲染详解
May 17 Javascript
关于vue-resource报错450的解决方案
Jul 24 Javascript
vue-cli项目中怎么使用mock数据
Sep 27 Javascript
微信小程序实现上传多张图片、删除图片
Jul 29 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一些常用的正则表达式字符的一些转换
2008/07/29 PHP
PHP图形操作之Jpgraph学习笔记
2015/12/25 PHP
详解php魔术方法(Magic methods)的使用方法
2016/02/14 PHP
PHP设计模式之装饰器模式定义与用法简单示例
2018/08/13 PHP
张孝祥JavaScript学习阶段性总结(2)--(X)HTML学习
2007/02/03 Javascript
Jquery知识点三 jquery表单对象操作
2011/01/17 Javascript
19个很有用的 JavaScript库推荐
2011/06/27 Javascript
jQuery实现在textarea指定位置插入字符或表情的方法
2015/03/11 Javascript
在JavaScript的jQuery库中操作AJAX的方法讲解
2015/08/15 Javascript
jQuery基于ajax()使用serialize()提交form数据的方法
2015/12/08 Javascript
浅谈Javascript数据属性与访问器属性
2016/07/26 Javascript
微信小程序中单位rpx和rem的使用
2016/12/06 Javascript
微信小程序 用户数据解密详细介绍
2017/01/09 Javascript
简单实现nodejs上传功能
2017/01/14 NodeJs
NodeJS创建最简单的HTTP服务器
2017/05/15 NodeJs
vue.js将时间戳转化为日期格式的实现代码
2018/06/05 Javascript
vue路由守卫及路由守卫无限循环问题详析
2019/09/05 Javascript
原生js基于canvas实现一个简单的前端截图工具代码实例
2019/09/10 Javascript
Vue自定义render统一项目组弹框功能
2020/06/07 Javascript
NodeJS开发人员常见五个错误理解
2020/10/14 NodeJs
Vue2.x和Vue3.x的双向绑定原理详解
2020/11/05 Javascript
python 文件与目录操作
2008/12/24 Python
Python使用xlrd读取Excel格式文件的方法
2015/03/10 Python
解决pycharm 误删掉项目文件的处理方法
2018/10/22 Python
python列表生成器迭代器实例解析
2019/12/19 Python
Django bulk_create()、update()与数据库事务的效率对比分析
2020/05/15 Python
THE OUTNET美国官网:国际设计师品牌折扣网站
2017/03/07 全球购物
中兴通讯全球官方网站:ZTE
2020/12/26 全球购物
职业生涯规划怎么写
2013/12/29 职场文书
课改先进个人汇报材料
2014/01/26 职场文书
我的大学生活演讲稿
2014/04/25 职场文书
《放飞蜻蜓》教学反思
2014/04/27 职场文书
银行青年文明号事迹材料
2014/05/31 职场文书
租车协议书
2015/01/27 职场文书
库房管理员岗位职责
2015/02/12 职场文书
2016年小学“公民道德宣传日”活动总结
2016/04/01 职场文书