Esta resposta ao comando da linha de comandos para matar automaticamente um comando após um certo período de tempo
propõe um método de 1 linha para atingir o tempo limite de um comando de longa execução a partir da linha de comando do bash:
( /path/to/slow command with options ) & sleep 5 ; kill $!
Mas é possível que um determinado comando "de longa execução" termine antes do tempo limite. (Vamos chamá-lo de um comando "normalmente de longa execução, mas às vezes rápido", ou tlrbsf por diversão.)
Portanto, essa abordagem bacana de uma linha apresenta alguns problemas. Primeiro, sleep
não é condicional, de modo que define um limite inferior indesejável para o tempo necessário para a sequência terminar. Considere 30s ou 2m ou até 5m para o sono, quando o comando tlrbsf terminar em 2 segundos - altamente indesejável. Segundo, como kill
é incondicional, portanto, essa sequência tentará eliminar um processo que não está em execução e se queixar.
Assim...
Existe uma maneira de atingir o tempo limite de um comando tipicamente de execução longa, mas às vezes rápido ( "tlrbsf" ) que
- possui uma implementação bash (a outra pergunta já possui respostas Perl e C)
- terminará no início dos dois: término do programa tlrbsf ou tempo limite decorrido
- não matará processos inexistentes / não em execução (ou, opcionalmente: não reclamará de uma matança incorreta)
- não precisa ser um liner
- pode ser executado no Cygwin ou Linux
... e, para pontos de bônus, executa o comando tlrbsf em primeiro plano e qualquer processo 'sleep' ou extra em segundo plano, de modo que o stdin / stdout / stderr do comando tlrbsf possa ser redirecionado, mesmo como se tivesse sido correr diretamente?
Nesse caso, compartilhe seu código. Se não, por favor explique o porquê.
Passei um tempo tentando hackear o exemplo mencionado, mas estou atingindo o limite de minhas habilidades no bash.
timeout
utilitário gnu ?
timeout
é ótimo! você pode até usar com vários comandos (script de várias linhas): stackoverflow.com/a/61888916/658497