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.


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.


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.


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).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.