47 lines
1.0 KiB
Bash
Executable File
47 lines
1.0 KiB
Bash
Executable File
#!/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 "$@"
|