IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

fabric执行在后台运行的命令

笑遍世界 2015-07-23 14:03:12 累计浏览 1,810 次
本机暂存

   最近一个项目需要用30个左右的jmeter客户端来做压力测试,需要做一些部署和配置工作,这时我喜欢的Fabric就可以发挥它的力量了。其中,我希望将jmeter施压段放到后台去运行,最开始将“nohup xxx &”放到fabric的run()中执行时,却没有执行;后来看了下文档,并做了些实验。

   对于直接使用“&”放到后台执行的情况,Fabric推荐使用如下3种情况来替代(按鲁棒性从高到低排列):

   1.使用已经存在daemon技术,如init、supervisord、upstart、systemd等,例如:/etc/init.d/tomcat restart 这样的命令,另外supervisord我也是很喜欢的。

   2.使用screen、tmux、dtach等工具来从当前shell中detach进程。如:screen -d -m sleep 10 这样的命令。注:要设置pty=False,如 run(‘screen -d -m sleep 10′, pty=False)。

   3.使用nohup,不过确实如官方文档所说只有部分用户能成功,我用nohup在run()中时就遇到了问题后该用screen了。

   共享一个前几天写的jmeter相关的fabfile吧: https://github.com/smilejay/python/blob/master/py2015/unified_order_fabfile.py

View Code PYTHON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!/usr/bin/env python
# a fabfile to manange the performance test for unified order project.
# usage: fab -f unified_order_fabfile.py start_jmeter -P -z 30
# author: Jay <smile665@gmail.com>
 
from fabric.context_managers import cd
from fabric.operations import run, put
from fabric.api import task, env
 
env.hosts = ['192.168.1.2', '192.168.1.3', '192.168.1.4']
env.port = 22
env.user = 'root'
env.password = '123456'
 
 
@task
def hostname():
    # show hostname   # just for testing
    with cd('/tmp'):
        run('hostname')
 
 
@task
def copy_jmeter():
    # copy jmeter to other machines
    with cd('/tmp'):
        run('rm -rf jakarta-jmeter-2.3.4')
        put('jakarta-jmeter-2.3.4', '/tmp/')
        run('cd jakarta-jmeter-2.3.4/bin; chmod a+x jmeter')
        #run('ls /tmp/')
 
 
@task
def start_jmeter():
    # run jmeter in all test clients
    #with cd('/tmp/'):
    with cd('/tmp/jakarta-jmeter-2.3.4/bin/'):
        run('screen -d -m ./jmeter -n -t my-order.jmx -l log.jtl &>abc.log')
        #run('./jmeter -n -t unified-order.jmx -l log.jtl &>abc.log')
        #run('screen -d -m sleep 10', pty=False)
        #run('service tomcat start', pty=False)
 
 
@task
def kill_jmeter():
    # kill the jmeter processes for unified order project
    with cd('/tmp/'):
        pids = run("ps -ef | grep unified | grep -v 'grep' | awk '{print $2'}")
        pid_list = pids.split('\r\n')
        for i in pid_list:
            run('kill -9 %s' % i)
 
 
@task
def get_status():
    # get jmeter(java) running status
    with cd('/tmp'):
        run('ps -ef | grep unified | grep java | grep -v grep')

   参考文档:http://fabric.readthedocs.org/en/1.6/faq.html

同分类推荐文章

  1. 从零重建 macOS 开发机:可复现的环境初始化流程 (2026-06-14 20:36:00)
  2. 百度物理网络监控工具开源第二弹:毫秒级监控工具 baize,让你的网络问题无处遁形 (2026-06-11 08:10:28)
  3. How to Set Up Homebrew Tap for Private CLI Tools: A Complete Guide (2026-05-27 02:13:03)

查看更多 DevOps 文章 →

建议继续学习

  1. 用Hyer来进行网站的抓取 (累计阅读 158,250)
  2. 配置Nginx+uwsgi更方便地部署python应用 (累计阅读 107,164)
  3. 程序员技术练级攻略 (累计阅读 35,468)
  4. python实现自动登录discuz论坛 (累计阅读 32,833)
  5. python编程细节──遍历dict的两种方法比较 (累计阅读 20,370)
  6. WEB系统需要关注的一些点 (累计阅读 18,218)
  7. 每个程序员都应该学习使用Python或Ruby (累计阅读 17,917)
  8. Chrome和goagent的配置方法,你懂的 (累计阅读 16,842)
  9. 批量添加主机到cacti+nagios的监控报警系统中 (累计阅读 14,990)
  10. 30分钟3300%性能提升――python+memcached网页优化小记 (累计阅读 13,740)