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 相关文章推荐
用js实现手把手教你月入万刀(转贴)
Nov 07 Javascript
javascript 循环调用示例介绍
Nov 20 Javascript
jquery实现动态菜单的实例代码
Nov 28 Javascript
jQuery学习笔记之创建DOM元素
Jan 19 Javascript
Svg.js实例教程及使用手册详解(一)
May 16 Javascript
微信小程序 开发之滑块视图容器(swiper)详解及实例代码
Feb 22 Javascript
原生javascript移动端滑动banner效果
Mar 10 Javascript
JS实现的数组去除重复数据算法小结
Nov 17 Javascript
详解微信小程序审核不通过的解决方法
Jan 17 Javascript
基于Vuejs的搜索匹配功能实现方法
Mar 03 Javascript
vue实现的树形结构加多选框示例
Feb 02 Javascript
JS前端模块化原理与实现方法详解
Mar 17 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/05/16 PHP
php操作redis中的hash和zset类型数据的方法和代码例子
2014/07/05 PHP
PHP开发框架kohana中处理ajax请求的例子
2014/07/14 PHP
php+flash+jQuery多图片上传源码分享
2020/07/27 PHP
input、button的不同type值在ajax提交表单时导致的陷阱
2009/02/24 Javascript
JavaScript 未结束的字符串常量常见解决方法
2010/01/24 Javascript
百度Popup.js弹出框进化版 拖拽小框架发布 兼容IE6/7/8,Firefox,Chrome
2010/04/13 Javascript
在JQuery dialog里的服务器控件 事件失效问题
2010/12/08 Javascript
JavaScript基础语法让人疑惑的地方小结
2012/05/23 Javascript
JQuery给元素添加/删除节点比如select
2013/04/02 Javascript
主页面中的两个iframe实现鼠标拖动改变其大小
2013/04/16 Javascript
jquery.uploadify插件在chrome浏览器频繁崩溃解决方法
2015/03/01 Javascript
js调出上下文菜单的实例
2015/12/17 Javascript
基于javascript实现彩票随机数生成(简单版)
2020/04/17 Javascript
全面解析Bootstrap中scrollspy(滚动监听)的使用方法
2016/06/06 Javascript
jQuery 翻页组件yunm.pager.js实现div局部刷新的思路
2016/08/11 Javascript
很实用的js选项卡切换效果
2016/08/12 Javascript
AngularJS 面试题集锦
2016/09/06 Javascript
原生js实现简单的链式操作
2017/07/04 Javascript
jQuery获取table表中的td标签(实例讲解)
2017/07/28 jQuery
addeventlistener监听scroll跟touch(实例讲解)
2017/08/04 Javascript
vue中keep-alive的用法及问题描述
2018/05/15 Javascript
如何利用vue+vue-router+elementUI实现简易通讯录
2019/05/13 Javascript
express如何解决ajax跨域访问session失效问题详解
2019/06/20 Javascript
Layui数据表格之单元格编辑方式
2019/10/26 Javascript
Django中几种重定向方法
2015/04/28 Python
Python中的fileinput模块的简单实用示例
2015/07/09 Python
python实现密度聚类(模板代码+sklearn代码)
2020/04/27 Python
html5新增的属性和废除的属性简要概述
2013/02/20 HTML / CSS
全球地下的服装和态度:Slam Jam
2018/02/04 全球购物
The Athlete’s Foot新西兰:新西兰最大的运动鞋零售商
2019/12/23 全球购物
化工专业自荐书
2014/06/16 职场文书
就业推荐表自我评价范文
2015/03/02 职场文书
Nginx中break与last的区别详析
2021/03/31 Servers
关于mysql中时间日期类型和字符串类型的选择
2021/11/27 MySQL
讲解Python实例练习逆序输出字符串
2022/05/06 Python