Limite de tempo para o script bash

2

Eu tenho um script bash e gostaria de definir um limite de tempo para ele. Por exemplo, se os scripts forem executados por mais de 50s, saia com 0. Deve ser feito dentro do script, não posso alterar o comando como o script é chamado.

Qual seria a melhor maneira de fazer isso?

Existe algo como a armadilha do tempo?

Eu poderia colocar todo o código dentro do loop, mas isso não é uma opção neste caso.

    
por Rokas.ma 18.05.2017 / 15:25

2 respostas

0

Parece que já foi respondido em outro lugar, mas aqui está o que você pode fazer.

Este é um comando que retorna por quantos segundos este comando foi executado (o s adicionado em tempos retorna apenas os segundos).

ps -p "<process-id>" -o times=

Você também pode precisar

pgrep <name-of-the-script>

Ou, no total,

ps -p "$(<name-of-the-script>)" -o times=

para obter o ID do processo.

Em seguida, você atribui o resultado a uma variável e verifica quantas vezes quiser.

    
por 18.05.2017 / 15:57
0

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.

    
por 18.05.2017 / 16:56