我在jenkins中编写了一个python脚本,如下所示:
import subprocess, shlex
def command(cmd):
return subprocess.call(shlex.split(cmd))
print '--- Begin ---'
command('ping -i 1 -c 3 192.168.1.2')
但jenkins中的控制台登录如下:
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.1.2: icmp_req=1 ttl=63 time=0.426 ms
64 bytes from 192.168.1.2: icmp_req=2 ttl=63 time=0.347 ms
64 bytes from 192.168.1.2: icmp_req=3 ttl=63 time=0.354 ms
--- 192.168.1.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.347/0.375/0.426/0.042 ms
--- Begin ---
为什么PING的日志显示在print '--- Begin ---'
之前?
这是一个jenkins bug吗?我的jenkins版本是v1.643
答案 0 :(得分:3)
我不认为这是一个错误。如果我记不清楚,你就无法在jenkins shell中打开子进程(即ping命令将独立于python进程运行)。因此,进程以@ knh170指向的方式异步运行。
答案 1 :(得分:1)
我遇到了同样的问题,并通过刷新stdout
在Python2中
print "something"
sys.stdout.flush()
在Python3中:
print("something", flush=True)
希望这有帮助
答案 2 :(得分:1)
问题是子进程是像@ knh170提到的那样异步启动的。因此,输出立即打印,而Python正在缓冲输出,直到完成。
您可以尝试使用:
-u Force stdin, stdout and stderr to be totally unbuffered.
#!/usr/bin/python -u
或者如果你调用脚本:
python -u <name>