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 11 Javascript
JavaScript toFixed() 方法
Apr 15 Javascript
js实现可拖动DIV的方法
Dec 17 Javascript
jQuery UI插件实现百度提词器效果
Nov 21 Javascript
Bootstrap显示与隐藏简单实现代码
Mar 06 Javascript
利用node.js实现反向代理的方法详解
Jul 24 Javascript
vue实现某元素吸顶或固定位置显示(监听滚动事件)
Dec 13 Javascript
vue实现点击关注后及时更新列表功能
Jun 26 Javascript
详解Node.js amqplib 连接 Rabbit MQ最佳实践
Jan 24 Javascript
详解vue更改头像功能实现
Apr 28 Javascript
Element Alert警告的具体使用方法
Jul 27 Javascript
JS的深浅复制详细
Oct 16 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中经典方法实现判断多维数组是否为空
2011/10/23 PHP
php画图实例
2014/11/05 PHP
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
2016/10/09 PHP
JavaScript 滚轮事件使用说明
2010/03/07 Javascript
jquery动态改变form属性提交表单
2014/06/03 Javascript
NodeJS制作爬虫全过程
2014/12/22 NodeJs
简介JavaScript中的setDate()方法的使用
2015/06/11 Javascript
JavaScript+html5 canvas绘制缤纷多彩的三角形效果完整实例
2016/01/26 Javascript
即将发布的jQuery 3 有哪些新特性
2016/04/14 Javascript
js实现当鼠标移到表格上时显示这一格全部内容的代码
2016/06/12 Javascript
基于MVC+EasyUI的web开发框架之使用云打印控件C-Lodop打印页面或套打报关运单信息
2016/08/29 Javascript
jQuery validate插件功能与用法详解
2016/12/15 Javascript
JavaScript函数柯里化原理与用法分析
2017/03/31 Javascript
获取url中用&隔开的参数实例(分享)
2017/05/28 Javascript
vue 打包后的文件部署到express服务器上的方法
2017/08/09 Javascript
详解React Native 采用Fetch方式发送跨域POST请求
2017/11/15 Javascript
微信小程序实现单选选项卡切换效果
2020/06/19 Javascript
Python 的描述符 descriptor详解
2016/02/27 Python
读取json格式为DataFrame(可转为.csv)的实例讲解
2018/06/05 Python
Django Channels 实现点对点实时聊天和消息推送功能
2019/07/17 Python
python实现FTP文件传输的方法(服务器端和客户端)
2020/03/20 Python
DataFrame.groupby()所见的各种用法详解
2020/06/14 Python
10 套华丽的CSS3 按钮小结
2012/10/03 HTML / CSS
使用css如何制作时间ICON方法实践
2012/11/12 HTML / CSS
美国汽车交易网站:Edmunds
2016/08/17 全球购物
Under Armour西班牙官网:美国知名的高端功能性运动品牌
2018/12/12 全球购物
技校毕业生自荐信范文
2014/03/07 职场文书
预防传染病方案
2014/06/14 职场文书
如何写股份合作协议书
2014/09/11 职场文书
2014年学生工作总结
2014/11/20 职场文书
2014年标准化工作总结
2014/12/17 职场文书
小学校园广播稿
2015/08/18 职场文书
《清澈的湖水》教学反思
2016/02/17 职场文书
go语言中GOPATH GOROOT的作用和设置方式
2021/05/05 Golang
一文搞懂Python Sklearn库使用
2021/08/23 Python
Vue router配置与使用分析讲解
2022/12/24 Vue.js