在使用 Fabric 的过程中遇到这样一个问题,因此写下这篇文章记录下。

需求:通过 Fabric 批量执行客户端上的一个脚本,对 flume 进行批量启动,flume 的启动脚本 start-flume.sh 如下

flume_env="/apps/svr/apache-flume-1.5.0-bin/"
nohup ${flume_env}bin/flume-ng agent -n agent_mobile_rank -c ${flume_env}conf/file2kafka/ -f ${flume_env}conf/file2kafka/file2kafka.conf &

Fabric 的脚本如下:

@roles('mobile-test')
def start_flume_client():
    with cd('/apps/svr/apache-flume-1.5.0-bin'):
        run('sh /apps/svr/apache-flume-1.5.0-bin/start-flume.sh')

然后执行的时候,发现没有生效,完全没有执行 start-flume.sh 脚本里面的 nohup 这行,于是 debug 日志看下,首先把 Fabric 的脚本修改成如下:

@roles('mobile-test')
def start_flume_client():
    with cd('/apps/svr/apache-flume-1.5.0-bin'):
        run('sh -x /apps/svr/apache-flume-1.5.0-bin/start-flume.sh')

执行脚本 fab start_flume_client --show=debug 日志如下:

[test@test-001 saltstack]$ fab start_flume_client --show=debug 
Using fabfile '/home/apps/ykq/saltstack/fabfile.py'
Commands to run: start_flume_client
Parallel tasks now using pool size of 8
[192.168.1.1] Executing task 'start_flume_client'
[192.168.1.1] run: /bin/bash -l -c "cd /apps/svr/apache-flume-1.5.0-bin && sh -x /apps/svr/apache-flume-1.5.0-bin/start-flume.sh"
[192.168.1.1] out: + flume_env=/apps/svr/apache-flume-1.5.0-bin/
[192.168.1.1] out: 

可以看到脚本 start-flume.sh```` 执行到flume_env``` 这步就没有执行了。

后面就是查找原因了, google 之后,关键字 Fabric nohup,首先查询到说是加一个参数 pty=False 可以解决这个问题,即把 Fabric 的脚本修改成如下:

@roles('mobile-test')
def start_flume_client():
    with cd('/apps/svr/apache-flume-1.5.0-bin'):
        run('sh -x /apps/svr/apache-flume-1.5.0-bin/start-flume.sh',pty=False)

debug 后发现,看日志执行是执行了,但是执行没有生效,继续找原因,然后找到原因说是因为由于Fabric 过早关闭了连接的 Session 导致的。为了解决这个问题,使用如下一个小技巧,修改脚本如下:

@roles('mobile-test')
def start_flume_client():
    with cd('/apps/svr/apache-flume-1.5.0-bin'):
        run('sh -x /apps/svr/apache-flume-1.5.0-bin/start-flume.sh && sleep 1')

再次执行,成功。


yexiaobai
4.8k 声望875 粉丝

就是不告诉你 O(∩_∩)O哈哈~。


引用和评论

0 条评论