Você precisa de um wrapper.
O mais óbvio é renomear o script original e, em seu lugar, criar um script de invólucro que chame o original com um tempo limite. Uma variação disso é criar um link com um nome diferente para o próprio script, e a maneira como o script é chamado decidirá o que acontece nele. Deve ficar claro daqui a pouco.
Se o seu script for chamado sem parâmetros, você poderá adicionar esse wrapper interno ao seu script. Ele será invocado novamente com timeout
e com um parâmetro no parâmetro $1
.
#!/usr/bin/env bash
TIMEOUT=10
WRAPPER=FALSE
if [ "$1" != FALSE ]; then
timeout "$TIMEOUT" "$0" "$WRAPPER"
exit
fi
#the proper script
echo Here\'s the original script starting.
sleep 11
echo End of the original script.
Voltando à solução anterior, você pode usar $0
para ver como o script foi chamado. Foi o arquivo ou o link para ele?
Se você não quiser ou não puder criar um novo executável / link, e a chamada original usar parâmetros, outras opções estarão disponíveis. Por exemplo, um arquivo temporário pode ser usado. Isso envolverá alguns casos de canto que exigem uma limpeza desse arquivo caso algo dê errado. Você também pode usar o PPID como um comutador. Se o comando do pai é o mesmo que filho, ele executa o script propriamente dito, caso contrário, ele se executa com um tempo limite.