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判断是手机还是电脑访问网页的简单实例分享
Jun 03 Javascript
JavaScript代码实现左右上下自动晃动自动移动
Apr 08 Javascript
Angular.js去除页面中显示的空行方法示例
Mar 30 Javascript
不到200行 JavaScript 代码实现富文本编辑器的方法
Jan 03 Javascript
JS关于刷新页面的相关总结
May 09 Javascript
详解Angular路由之路由守卫
May 10 Javascript
Bootstrap标签页(Tab)插件切换echarts不显示问题的解决
Jul 13 Javascript
animate.css在vue项目中的使用教程
Aug 05 Javascript
React key值的作用和使用详解
Aug 23 Javascript
layui 对弹窗 form表单赋值的实现方法
Sep 04 Javascript
解决vue+elementui项目打包后样式变化问题
Aug 03 Javascript
React倒计时功能实现代码——解耦通用
Sep 18 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 fputcsv命令 写csv文件遇到的小问题(多维数组连接符)
2011/05/24 PHP
基于empty函数的判断详解
2013/06/17 PHP
一漂亮的PHP图片验证码实例
2014/03/21 PHP
Thinkphp5框架ajax接口实现方法分析
2019/08/28 PHP
解决laravel 表单提交-POST 异常的问题
2019/10/15 PHP
PHP+ajax实现上传、删除、修改单张图片及后台处理逻辑操作详解
2020/02/12 PHP
js中将多个语句写成一个语句的两种方法小结
2007/12/08 Javascript
JQuery.uploadify 上传文件插件的使用详解 for ASP.NET
2010/01/22 Javascript
基于JQuery的cookie插件
2010/04/07 Javascript
javascript中input中readonly和disabled区别介绍
2012/10/23 Javascript
avascript中的自执行匿名函数应用示例
2014/09/15 Javascript
JS实现文件动态顺序载入的方法
2015/03/07 Javascript
swtich/if...else的替代语句
2015/08/16 Javascript
JavaScript实现设计模式中的单例模式的一些技巧总结
2016/05/17 Javascript
AngularJS自定义服务与fliter的混合使用
2016/11/24 Javascript
教你一步步用jQyery实现轮播器
2016/12/18 Javascript
jQuery选择器实例应用
2017/01/05 Javascript
gulp教程_从入门到项目中快速上手使用方法
2017/09/14 Javascript
Vue组件之单向数据流的解决方法
2018/11/10 Javascript
手把手带你搭建一个node cli的方法示例
2020/08/07 Javascript
[03:57]《不朽》——2015DOTA2国际邀请赛—中国军团出征主题曲MV
2015/07/15 DOTA
[01:32]DOTA2 2015国际邀请赛中国区预选赛第四日战报
2015/05/29 DOTA
[00:32]2018DOTA2亚洲邀请赛VGJ.T出场
2018/04/03 DOTA
python自动化测试之连接几组测试包实例
2014/09/28 Python
编写Python脚本来实现最简单的FTP下载的教程
2015/05/04 Python
Python使用sqlalchemy模块连接数据库操作示例
2019/03/13 Python
python FTP批量下载/删除/上传实例
2019/12/22 Python
python基于三阶贝塞尔曲线的数据平滑算法
2019/12/27 Python
Python3 字典dictionary入门基础附实例
2020/02/10 Python
HTML5移动开发图片压缩上传功能
2016/11/09 HTML / CSS
业务员岗位职责
2013/11/16 职场文书
竞聘演讲稿怎么写
2014/08/28 职场文书
幼儿园欢迎词范文
2015/01/26 职场文书
居安思危观后感
2015/06/11 职场文书
初三英语教学反思
2016/02/15 职场文书
pytorch 梯度NAN异常值的解决方案
2021/06/05 Python