我有一个执行“foo.sh”和“bar.sh”的Jenkins作业,这些脚本分别生成“foo.log”,“bar.log”。 foo.sh和bar.sh是长时间运行的作业,我不想在jenkins的“Console Output”视图中查看统一的日志文件。
我知道我可以将这些日志存档为构建工件,但我想从一个视图 - 控制台输出监视所有3个日志(“控制台输出”/ stdout,foo.log和bar.log)。
是否有插件或配置选项可以让我这样做?
注意:foo.sh
和bar.sh
显然是占位符,但我担心它们来自供应商,我无法修改它们来调整日志记录行为。
答案 0 :(得分:2)
假设您的文件位于$WORKSPACE
下:
tail -F *.log
修改强>
或者您可以考虑重新编写foo.sh
和bar.sh
,而不是重定向到日志文件,tee
来控制和日志文件。
echo "doing stuff" 2>&1|tee -a foo.log
上面将打印到控制台(显示在Jenkins控制台输出中),并重定向到foo.log
编辑2:
如果您无法控制foo.sh
和bar.sh
,则需要一个包装脚本来启动它们。
基本上,在您将foo.sh
发送到后台(以便我们可以继续)之后,在您tail
日志之前,您需要确保tail
被杀死。我们通过启动另一个后台进程来监视foo.sh
进程并终止tail
(尚未在脚本中启动)来执行此操作。由于我们尚未启动tail
,我们实际上并不知道它的PID是什么,因此我们通过命令行引用它
# Send foo.sh to background and record the PID
echo "Launching foo.sh to background"
nohup ./foo.sh &
foo_pid=$!
echo "Foo PID to monitor=$foo_pid"
# Launch a statement that will run ever 3 seconds to monitor status
# of foo.sh, and if foo.sh finished, then kill a 'future' tail command
echo "Launching tail-killer to background"
nohup $(sleep 3; while kill -0 $foo_pid; do sleep 3; done; kill $(ps --no-heading -C "tail -F foo.log" | awk '{print $1}') ) &
# Tail foo.sh's log
echo "Launching tail to monitor foo.sh"
echo
tail -F foo.log
echo
# Get the return code of foo.sh
wait $foo_pid
echo "Foo.sh returned with $?
<强>考虑/改进:强>
Foo.sh
在调用tail
之前可以在开始后打印超过10行。使用tail -n
增加起始行数。tail -F foo.log
,“杀手”将会中断。您应该将其修改为更强大