Foi bem sucedido com um script de tempo limite "pequeno" que verifica o tamanho do arquivo de log para determinar se o processo ainda está funcionando. Não é bonita, mas ajudou:
#!/bin/sh
TIMEOUT=$1
FILE=$2
PID=$3
if [ -z "$PID" ]
then
echo $0 timeout file pid
echo " e.g. 60 /tmp/log 16325"
exit
fi
echo "stalekill: timeout=$TIMEOUT file=$FILE pid=$PID"
sleep 1
SIZE=0
while true
do
sleep 3
NEWSIZE=$(stat -c%s "$FILE")
if [ "$NEWSIZE" -eq "$SIZE" ]
then
echo "stalekill '$FILE' unchanged; $SIZE"
sleep $TIMEOUT
NEWSIZE=$(stat -c%s "$FILE")
if [ "$NEWSIZE" -eq "$SIZE" ]
then
kill $PID || sleep 2 && kill -9 $PID
exit
fi
echo "stalekill '$FILE' changed; $SIZE..$NEWSIZE"
else
echo "stalekill '$FILE' changed; $SIZE..$NEWSIZE"
fi
SIZE=$NEWSIZE
done
Chamada da seguinte forma (em um loop):
./offlineimap.py >> ./log.txt 2>&1 & stalekill 25 ./log.txt $!
O tempo não é excessivamente profissional, e seria ainda melhor se ele também verificasse se o processo já havia terminado; mas basicamente fez o feito.
Mas, mesmo assim, se alguém souber uma solução diferente ou mais padronizada para essa tarefa: accepted answer tick still available
.