Para começar, o pipeline de watchdog da sua pergunta provavelmente não mataria o process1
, a menos que ele esteja tentando gravar novamente no pipe morto. Então o seu cão de guarda deveria de alguma forma explicitamente matar o process1.
Além disso, há um script shell watchdog.sh
muito simples. Você pode testá-lo interativamente no console. Apenas digite ./watchdog.sh
. Ele duplicará tudo o que você digitar e parará se você não digitar algo por 5 segundos.
#!/bin/bash
# first arg is timeout (default: 5)
T="${1:-5}"
PID=$$
exec tee >(bash -c '
while true ; do
bytes=$(timeout '$T' cat | wc -c)
if ! [ "$bytes" -gt 0 ] ;then
break
fi
done
## add something like "killall process1", for now we just kill this tee command
kill -9 '$PID)
Note que o script irá, na verdade, expirar entre T e 2 * T (caso contrário, seria muito mais complicado). De alguma forma, você poderia adicionar uma forma de matar process1
como mencionei inicialmente.
Abaixo um exemplo para teste.
process1.sh:
#!/bin/bash
echo "here we are ..."
sleep 2
echo "still alive ..."
sleep 20
echo "too late ..."
E execute-o assim (inclusive um método feio para matar o process1.sh no tempo limite):
(./process1.sh & echo $! >/tmp/pid; wait) |(./watchdog.sh 5; kill 'cat /tmp/pid')