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 相关文章推荐
JQery 渐变图片导航效果代码 漂亮
Jan 01 Javascript
JS实现图片翻书效果示例代码
Sep 09 Javascript
基于jquery实现表格无刷新分页
Jan 07 Javascript
require、backbone等重构手机图片查看器
Nov 17 Javascript
详细分析JS函数去抖和节流
Dec 05 Javascript
推荐10款扩展Web表单的JS插件
Dec 25 Javascript
微信小程序button组件使用详解
Jan 31 Javascript
Angular5给组件本身的标签添加样式class的方法
Apr 07 Javascript
对vue下点击事件传参和不传参的区别详解
Sep 15 Javascript
微信小程序如何加载数据库真实数据的实现
Mar 04 Javascript
基于leaflet.js实现修改地图主题样式的流程分析
May 15 Javascript
node运行js获得输出的三种方式示例详解
Jul 02 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
[EPIC] Larva vs Flash ZvT @ Crossing Field [2017-10-09]
2020/03/17 星际争霸
php 获取远程网页内容的函数
2009/09/08 PHP
php.ini-dist 和 php.ini-recommended 的区别介绍(方便开发与安全的朋友)
2012/07/01 PHP
LotusPhp笔记之:Cookie组件的使用详解
2013/05/06 PHP
一个PHP针对数字的加密解密类
2014/03/20 PHP
php图片的二进制转换实现方法
2014/12/15 PHP
php数组生成html下拉列表的方法
2015/07/20 PHP
jquery.autocomplete修改实现键盘上下键自动填充示例
2013/11/19 Javascript
无限树Jquery插件zTree的常用功能特性总结
2014/09/11 Javascript
推荐一个封装好的getElementsByClassName方法
2014/12/02 Javascript
微信小程序使用第三方库Immutable.js实例详解
2016/09/27 Javascript
jQuery插件fullPage.js实现全屏滚动效果
2016/12/02 Javascript
原生的强大DOM选择器querySelector介绍
2016/12/21 Javascript
vue引入ueditor及node后台配置详解
2018/01/03 Javascript
vue element-ui之怎么封装一个自己的组件的详解
2019/05/20 Javascript
使用zrender.js绘制体温单效果
2019/10/31 Javascript
json.stringify()与json.parse()的区别以及用处
2021/01/25 Javascript
[02:20]DOTA2亚洲邀请赛 EHOME战队出场宣传片
2015/02/07 DOTA
在Python的Django框架上部署ORM库的教程
2015/04/20 Python
Python多线程结合队列下载百度音乐的方法
2015/07/27 Python
Python开发中爬虫使用代理proxy抓取网页的方法示例
2017/09/26 Python
ubuntu安装sublime3并配置python3环境的方法
2018/03/15 Python
Python简单计算文件MD5值的方法示例
2018/04/11 Python
使用 Python 清理收藏夹里已失效的网站
2019/12/03 Python
python爬虫开发之selenium模块详细使用方法与实例全解
2020/03/09 Python
使用html2canvas将页面转成图并使用用canvas2image下载
2019/04/04 HTML / CSS
德国低价购买灯具和家具网站:Style-home.de
2016/11/25 全球购物
意大利网上书店:LaFeltrinelli
2020/06/12 全球购物
Weblogic的布署方式
2013/08/23 面试题
护理工作感言
2014/01/16 职场文书
银行授权委托书范本
2014/10/04 职场文书
幼儿园食品安全责任书
2015/05/08 职场文书
老干部座谈会主持词
2015/07/03 职场文书
《自己的花是让别人看的》教学反思
2016/02/19 职场文书
python中如何对多变量连续赋值
2021/06/03 Python
python数字图像处理之对比度与亮度调整示例
2022/06/28 Python