Comando Bash Run por certo tempo?

12

Estou fazendo o script bash para meu uso. Como posso executar um comando por um tempo determinado, como 20 segundos e finalizar o comando? Tentei muitas soluções, mas nada funciona, também tentei o comando timeout sem sucesso. Por favor, me dê uma solução para isso.

por exemplo: desejo executar este comando no script e no terminal após 10 segundos

some command
Umair Riaz
fonte

Respostas:

14

Hum, isso deve fazer o truque:

xmessage "Hello World" &
pidsave=$!
sleep 10; kill $pidsave

xmessagefornece um caso de teste rápido aqui (no seu caso, o comando airodump deve ir para lá); &coloca em segundo plano.

$!mantém o PID do último processo iniciado (consulte, por exemplo, /programming//a/1822042/2037712 ); o PID é salvo na variável pidsave.

Depois de esperar ( sleep), envie um TERMsinal para o processo.

mpy
fonte
Obrigado amigo, funciona, mas agora tenho 1 problema. Eu quero ver a saída que é criada pelo comando, mas o Windows xmessage não mostra nada.
Umair Riaz
@UmairRiaz: xmessage foi apenas um exemplo. Para adaptar seu exemplo na pergunta e registrar a saída do comando, use some command > logfile &na primeira linha. Depois você pode analisar logfile.
mpy
4

No prompt do bash, você pode usar "

  • your_command & sleep 20; kill $!
  • Ou use o comando timeout: por exemplo, aptget install timeoutetimeout -k 3m 14s your_command
  • Ou use expectcomo explicado aqui: /unix/43340/how-to-introduce-timeout-for-shell-scripting
  • ou faça-o com perl: perl -e "alarm 10; exec @ARGV" "Your_command"
  • Ou use esta solução mais enigmática: $COMMAND 2>&1 >/dev/null & WPID=$!; sleep $TIMEOUT && kill $! & KPID=$!; wait $WPID( Fonte e explicação )
Hennes
fonte
1

Outra maneira é usar o padrão pgrep $ ou pkill $; retorna todos os PIDs correspondentes ao padrão especificado, analisando todos os processos em execução na máquina. Portanto, para limitar o escopo dos PIDs apenas aos seus, use: padrão pgrep -P $ mypid $ ou pkill -P $ mypid $ pattern

Portanto, para executar um processo em segundo plano por um período de tempo definido, seu script seria algo como isto:

#!/bin/bash 
mypid=$$
run_something &
sleep $time_in_seconds
pkill -P $mypid something

Lembre-se de que isso eliminará todos os processos com o mesmo padrão de nome em execução no PID pai atual. Então você pode usar isso para iniciar vários processos e matá-los todos simultaneamente após um certo tempo.

Paulo
fonte