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 相关文章推荐
XMLHTTPRequest的属性和方法简介
Nov 23 Javascript
谈谈JavaScript中的函数与闭包
Apr 14 Javascript
javascript制作的滑动图片菜单
May 15 Javascript
onclick和onblur冲突问题的快速解决方法
Apr 28 Javascript
基于JQuery实现的跑马灯效果(文字无缝向上翻动)
Dec 02 Javascript
Bootstrap面板学习使用
Feb 09 Javascript
微信小程序 地图map实例详解
Jun 07 Javascript
vue.js前后端数据交互之提交数据操作详解
Apr 24 Javascript
jQuery移动端跑马灯抽奖特效升级版(抽奖概率固定)实现方法
Jan 18 jQuery
解决微信小程序调用moveToLocation失效问题【超简单】
Apr 12 Javascript
小程序绑定用户方案优化小结
May 15 Javascript
优雅的使用javascript递归画一棵结构树示例代码
Sep 22 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比你想象的好得多
2014/11/27 PHP
Laravel5.4简单实现app接口Api Token认证方法
2019/08/29 PHP
laravel 时间格式转时间戳的例子
2019/10/11 PHP
Yii框架数据库查询、增加、删除操作示例
2019/10/14 PHP
使用laravel指定日志文件记录任意日志
2019/10/17 PHP
一些常用且实用的原生JavaScript函数
2010/09/08 Javascript
js原型继承的两种方法对比介绍
2014/03/30 Javascript
JavaScript获取网页、浏览器、屏幕高度和宽度汇总
2014/12/18 Javascript
使用JQuery FancyBox插件实现图片展示特效
2015/11/16 Javascript
JavaScript中split与join函数的进阶使用技巧
2016/05/03 Javascript
ES6新特性二:Iterator(遍历器)和for-of循环详解
2017/04/20 Javascript
基于JavaScript实现类名的添加与移除
2017/04/23 Javascript
bootstrap实现二级下拉菜单效果
2017/11/23 Javascript
Vue响应式原理深入解析及注意事项
2017/12/11 Javascript
Three.js实现简单3D房间布局
2018/12/30 Javascript
jquery 时间戳转日期过程详解
2019/10/12 jQuery
vue实现权限控制路由(vue-router 动态添加路由)
2019/11/04 Javascript
详解ES6 CLASS在微信小程序中的应用实例
2020/04/24 Javascript
[05:40]DOTA2荣耀之路6:Wings最后进攻
2018/05/30 DOTA
深入理解python函数递归和生成器
2016/06/06 Python
详解python如何调用C/C++底层库与互相传值
2016/08/10 Python
Python实现计算圆周率π的值到任意位的方法示例
2018/05/08 Python
python requests指定出口ip的例子
2019/07/25 Python
Python selenium 自动化脚本打包成一个exe文件(推荐)
2020/01/14 Python
Django执行源生mysql语句实现过程解析
2020/11/12 Python
科沃斯机器人官网商城:Ecovacs
2016/08/29 全球购物
香港网上花店:FlowerAdvisor香港
2019/05/30 全球购物
彪马俄罗斯官网:PUMA俄罗斯
2019/07/13 全球购物
技校教师求职简历的自我评价
2013/10/20 职场文书
服务标语大全
2014/06/18 职场文书
班级团队活动方案
2014/08/14 职场文书
心得体会的写法
2014/09/05 职场文书
答谢词范文
2015/01/05 职场文书
2015年技术工作总结范文
2015/04/20 职场文书
党校团干班培训心得体会
2016/01/06 职场文书
创业计划书之网络外卖
2019/10/31 职场文书