在使用 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')
再次执行,成功。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。