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 相关文章推荐
采用CSS和JS,刚好我最近有个站点要用到下拉菜单!
Jun 26 Javascript
js模仿hover的具体实现代码
Dec 30 Javascript
jQuery控制文本框只能输入数字和字母及使用方法
May 26 Javascript
如何利用JSHint减少JavaScript的错误
Aug 23 Javascript
深入理解Node.js 事件循环和回调函数
Nov 02 Javascript
Html中 IFrame的用法及注意点
Dec 22 Javascript
vue.js的提示组件
Mar 02 Javascript
通过js修改input、select默认字体颜色
Apr 19 Javascript
浅谈React深度编程之受控组件与非受控组件
Dec 26 Javascript
JS运动特效之完美运动框架实例分析
Jan 24 Javascript
AngularJS对动态增加的DOM实现ng-keyup事件示例
Mar 12 Javascript
vue+element创建动态的form表单及动态生成表格的行和列
May 20 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中__FILE__、dirname与basename用法实例分析
2014/12/01 PHP
Laravel中Trait的用法实例详解
2016/03/16 PHP
php 在字符串指定位置插入新字符的简单实现
2016/06/28 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
laravel执行php artisan migrate报错的解决方法
2019/10/09 PHP
基于PHP的登录和注册的功能的实现
2020/08/06 PHP
JS 操作符整理[推荐收藏]
2011/11/15 Javascript
Javascript 颜色渐变效果的实现代码
2013/10/01 Javascript
jquery datatable后台封装数据示例代码
2014/08/07 Javascript
jquery 插件实现瀑布流图片展示实例
2015/04/03 Javascript
AngularJS基础 ng-dblclick 指令用法
2016/08/01 Javascript
浅谈js中字符和数组一些基本算法题
2016/08/15 Javascript
微信小程序 http请求详细介绍
2016/10/09 Javascript
关于webuploader插件使用过程遇到的小问题
2016/11/07 Javascript
JS键盘版计算器的制作方法
2016/12/03 Javascript
js实现PC端和移动端刮卡效果
2020/03/27 Javascript
详解require.js配置路径的用法和css的引入
2017/09/06 Javascript
Vue中使用canvas方法总结
2019/02/12 Javascript
Vue开发环境跨域访问问题
2020/01/22 Javascript
跟老齐学Python之复习if语句
2014/10/02 Python
python中使用序列的方法
2015/08/03 Python
详解Python Matplot中文显示完美解决方案
2019/03/07 Python
简单了解python中的与或非运算
2019/09/18 Python
在python里使用await关键字来等另外一个协程的实例
2020/05/04 Python
python构造IP报文实例
2020/05/05 Python
python自动化测试三部曲之request+django实现接口测试
2020/10/07 Python
英国DVD和蓝光碟片购买网站:Zoom.co.uk(电影和电视)
2019/09/23 全球购物
英国领先的在线礼品店:Getting Personal
2019/09/24 全球购物
当我正在为表建立索引的时候,SQL Server 会禁止对表的访问吗
2014/04/28 面试题
绩效工资分配方案
2014/01/18 职场文书
国际经济与贸易专业求职信
2014/07/10 职场文书
2014县委书记四风对照检查材料思想汇报
2014/09/21 职场文书
个人工作保证书
2015/02/28 职场文书
出生证明范本
2015/06/15 职场文书
会计做账心得体会
2016/01/22 职场文书
如何用python反转图片,视频
2021/04/24 Python