47 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
		
		
			
		
	
	
			47 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Bash
		
	
	
	
	
	
| 
								 | 
							
								#!/usr/bin/env bash
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# travis_keepalive runs the given command and preserves its return value,
							 | 
						||
| 
								 | 
							
								# while it forks a child process what periodically produces a log line,
							 | 
						||
| 
								 | 
							
								# so that Travis won't abort the build after 10 minutes.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Why?
							 | 
						||
| 
								 | 
							
								# `t.Log()` in Go holds the buffer until the test does not pass or fail,
							 | 
						||
| 
								 | 
							
								# and `-race` can increase the execution time by 2-20x.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								set -euo pipefail
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								readonly KEEPALIVE_INTERVAL=300 # seconds => 5m
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								main() {
							 | 
						||
| 
								 | 
							
								  keepalive
							 | 
						||
| 
								 | 
							
								  $@
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Keepalive produces a log line in each KEEPALIVE_INTERVAL.
							 | 
						||
| 
								 | 
							
								keepalive() {
							 | 
						||
| 
								 | 
							
								  local child_pid
							 | 
						||
| 
								 | 
							
								  # Note: We fork here!
							 | 
						||
| 
								 | 
							
								  repeat "keepalive" &
							 | 
						||
| 
								 | 
							
								  child_pid=$!
							 | 
						||
| 
								 | 
							
								  ensureChildOnEXIT "${child_pid}"
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								repeat() {
							 | 
						||
| 
								 | 
							
								  local this="$1"
							 | 
						||
| 
								 | 
							
								  while true; do
							 | 
						||
| 
								 | 
							
								    echo "${this}"
							 | 
						||
| 
								 | 
							
								    sleep "${KEEPALIVE_INTERVAL}"
							 | 
						||
| 
								 | 
							
								  done
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Ensures that the child gets killed on normal program exit.
							 | 
						||
| 
								 | 
							
								ensureChildOnEXIT() {
							 | 
						||
| 
								 | 
							
								  # Note: SIGINT and SIGTERM are forwarded to the child process by Bash
							 | 
						||
| 
								 | 
							
								  # automatically, so we don't have to deal with signals.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  local child_pid="$1"
							 | 
						||
| 
								 | 
							
								  trap "kill ${child_pid}" EXIT
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								main "$@"
							 |