When a job is approaching it's maximum run-time limit, and --notify has been specified, SGE sends a SIGUSR2 60 seconds before sending a SIGKILL (abrupt; not capturable).
R code cannot handle SIGUSR2 signals, only SIGINT. If SGE would signal SIGINT instead, we could capture it internally as an interrupt condition, and using tryCatch(..., interrupt = ...), on.exit(), and likes to gracefully exit, e.g. close connections, checkpoint intermediate results, etc.
Idea
Update the default SGE template to signal SIGINT. Unlike Slurm, there is no user-facing option to change the type of signal in SGE. But we could use Bash traps to capture the SIGUSR2 and re-signal it as SIGINT. Something like:
#! /bin/bash
...
## Request SGE to send warning signals (SIGUSR2) before run-time limit termination#$ -notify
...
# Function to catch SGE run-time signals and re-signal as SIGINTforward_sigint() {
echo"Caught SGE run-time signal. Re-signal as SIGINT to R..."kill -2 "${R_PID}"2>/dev/null ||truewait"${R_PID}"
res=$?echo" - exit code (from signal handler): ${res}"exit"${res}"
}
# Trap SGE run-time limit signalstrap forward_sigint SIGUSR2
<%= rscript_call %> -e 'batchtools::doJobCollection("<%= uri %>")'&
R_PID=$!wait"${R_PID}"
res=$?# Clear the trap on normal exittrap - SIGUSR2
When a job is approaching it's maximum run-time limit, and
--notifyhas been specified, SGE sends aSIGUSR260 seconds before sending aSIGKILL(abrupt; not capturable).R code cannot handle
SIGUSR2signals, onlySIGINT. If SGE would signalSIGINTinstead, we could capture it internally as aninterruptcondition, and usingtryCatch(..., interrupt = ...),on.exit(), and likes to gracefully exit, e.g. close connections, checkpoint intermediate results, etc.Idea
Update the default SGE template to signal
SIGINT. Unlike Slurm, there is no user-facing option to change the type of signal in SGE. But we could use Bash traps to capture theSIGUSR2and re-signal it asSIGINT. Something like: