Finalize o processo depois que ele for executado por algum tempo

12

Quero limitar o tempo em que um grepcomando do processo pode ser executado ou estar vivo.

Por exemplo. Eu quero fazer o seguinte:

grep -qsRw -m1 "parameter" /var

Mas antes de executar o grepcomando, quero limitar o tempo de vida do grepprocesso, digamos não mais que 30 segundos.

Como eu faço isso?

E, se possível, como eu retorno ou redefino para não ter limite de tempo depois.

yael
fonte
3
você não perguntou isso já? stackoverflow.com/questions/3061377/…
Sem essa outra quastion porque eu não obter resposta sobre o orig quastion Yael
4
@yael: você obteve uma solução perfeitamente boa anteriormente, usando timeout, e até instruções sobre como instalá-la. É rude ignorar esta resposta e depois duplicar sua pergunta.
Paul R
desculpe, mas NÃO, eu não quero instalar nada no meu sistema THX yael
5
@yael: então você precisa atualizar a sua pergunta original para incluir essa restrição , não apenas duplicar a pergunta e começar tudo de novo
Paul R

Respostas:

11

Você pode usar o limite de tempo , ele está disponível no ubuntu padrão ou você mesmo pode compilá-lo.

timelimit executa um comando e finaliza o processo gerado após um determinado tempo com um determinado sinal. Um sinal de "aviso" é enviado primeiro e, depois de um tempo limite, um sinal de "morte", semelhante à maneira como init (8) opera no desligamento.

feniix
fonte
2
Não está no meu Ubuntus (desktop 10.10, servidor 11.04), então provavelmente não é o padrão. Mas facilmente agarrado com um rápido sudo aptitude install timelimit. Funciona muito bem quando instalado.
Dia
7

Aqui está uma festa um pouco hackish para isso:

grep -qsRw -m1 "parameter" /var &

GREPPID=$!

( sleep 30; kill $GREPPID ) &

fg $GREPPID

Basicamente, ele inicia a pesquisa em segundo plano, depois inicia um subshell que aguarda 30 segundos e depois mata o processo de pesquisa. Se a pesquisa demorar <30s, o processo já estará morto. Não é uma boa idéia matar um processo que já está morto, pois há uma chance muito pequena de que outra coisa reutilize o pid, mas, para algo assim, geralmente é bom. Por fim, a pesquisa é recolocada em primeiro plano e será executada até que seja concluída ou finalizada.

Walter Mundt
fonte
como obter o $? do grep neste caso, porque no meu script eu pego o $? do grep e verifique se o grep corresponde à string? yael
Não tenho certeza de que haja uma maneira direta de fazer isso. Além disso, essa abordagem não funciona em um script em que o bash não tem o controle de tarefas ativo. Talvez você precise recorrer a um pouco de hacker Perl para fazer o trabalho em um script. Hmm ...
Walter Mundt
é possível chegar esta pergunta ao perl? Yael
4

Crie um novo arquivo chamado "tgrep" e coloque o seguinte (ou chame como quiser):

#!/bin/bash
grep $@ &
PID=$!
sleep 30 && kill $PID 2>/dev/null &
wait $PID
exit 0

Em seguida, corra chmod a+x tgrep. Agora, se você quiser usá-lo, digite

./tgrep -i "results" /home/dan/*txt

Ou você pode apenas usá-lo como tgrep (sem o ./ e poder usá-lo em qualquer diretório) se o colocar em um diretório contido na sua variável $ PATH (como / home / dan / bin /, se estiver em sua variável $ PATH, caso contrário você pode adicioná-la).

Jarvin
fonte