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 相关文章推荐
基于Jquery的标签智能验证实现代码
Dec 27 Javascript
JavaScript对象创建及继承原理实例解剖
Feb 28 Javascript
JS+CSS实现滑动切换tab菜单效果
Aug 25 Javascript
JavaScript中的this,call,apply使用及区别详解
Jan 29 Javascript
Angular发布1.5正式版,专注于向Angular 2的过渡
Feb 18 Javascript
js表单处理中单选、多选、选择框值的获取及表单的序列化
Mar 08 Javascript
手写Vue弹窗Modal的实现代码
Sep 11 Javascript
详解vue-router 动态路由下子页面多页共活的解决方案
Dec 22 Javascript
node.JS路径解析之PATH模块使用方法详解
Feb 06 Javascript
VSCode 配置uni-app的方法
Jul 11 Javascript
js实现前端界面导航栏下拉列表
Aug 27 Javascript
vue组件中实现嵌套子组件案例
Aug 31 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面向对象程序设计继承用法简单示例
2018/12/28 PHP
PHPStudy下如何为Apache安装SSL证书的方法步骤
2019/01/23 PHP
Javascript实现的类似Google的Div拖动效果代码
2011/08/09 Javascript
JavaScript语言核心数据类型和变量使用介绍
2013/08/23 Javascript
ie下$.getJSON出现问题的解决方法
2014/02/12 Javascript
AngularJS入门教程之学习环境搭建
2014/12/06 Javascript
简单的jQuery入门指引
2015/07/28 Javascript
js时钟翻牌效果实现代码分享
2020/07/31 Javascript
jQuery实现宽屏图片轮播实例教程
2015/11/24 Javascript
js获取新浪天气接口的实现代码
2016/06/06 Javascript
老生常谈javascript变量的命名规范和注释
2016/09/29 Javascript
使用JS读取XML文件的方法
2016/11/25 Javascript
bootstrap table 表格中增加下拉菜单末行出现滚动条的快速解决方法
2017/01/05 Javascript
Extjs 中的 Treepanel 实现菜单级联选中效果及实例代码
2017/08/22 Javascript
使用pm2自动化部署node项目的方法步骤
2019/01/28 Javascript
基于Vue el-autocomplete 实现类似百度搜索框功能
2019/10/25 Javascript
React学习之JSX与react事件实例分析
2020/01/06 Javascript
python虚拟环境 virtualenv的简单使用
2020/01/21 Javascript
node.js使用yargs处理命令行参数操作示例
2020/02/11 Javascript
vue设置默认首页的操作
2020/08/12 Javascript
vue单应用在ios系统中实现微信分享功能操作
2020/09/07 Javascript
Python的Flask框架的简介和安装方法
2015/11/13 Python
python下调用pytesseract识别某网站验证码的实现方法
2016/06/06 Python
Python闭包执行时值的传递方式实例分析
2018/06/04 Python
Python 获取中文字拼音首个字母的方法
2018/11/28 Python
Python面向对象之类和对象实例详解
2018/12/10 Python
Python中那些 Pythonic的写法详解
2019/07/02 Python
python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法
2019/08/27 Python
wxPython实现分隔窗口
2019/11/19 Python
通过cmd进入python的步骤
2020/06/16 Python
长曲棍球装备:Lacrosse Monkey
2020/12/02 全球购物
餐饮企业总经理岗位职责范文
2014/02/18 职场文书
法院先进个人事迹材料
2014/05/04 职场文书
保护环境倡议书300字
2014/05/19 职场文书
高考作弊检讨书1500字
2015/02/16 职场文书
Python 读写 Matlab Mat 格式数据的操作
2021/05/19 Python