Termina il processo dopo che è stato permesso di eseguirlo per qualche tempo


13

Voglio limitare il tempo in cui un grepcomando di processo può essere eseguito o essere attivo.

Per esempio. Voglio eseguire le seguenti operazioni:

grep -qsRw -m1 "parameter" /var

Ma prima di eseguire il grepcomando voglio limitare la durata del grepprocesso, diciamo non più di 30 secondi.

Come faccio a fare questo?

E se è possibile, come posso tornare o ripristinare per non avere limiti di tempo in seguito.


3
non l'hai già chiesto? stackoverflow.com/questions/3061377/...

No questa altra domanda perché non ottengo risposta sulla domanda originale Yael

4
@yael: in precedenza hai ottenuto una soluzione perfettamente valida, utilizzando timeoute hai anche ricevuto istruzioni su come installarlo. È scortese ignorare questa risposta e quindi duplicare la tua domanda.
Paul R,

scusate ma NO non voglio installare nulla sul mio sistema THX yael

5
@yael: allora devi aggiornare la tua domanda originale per includere questo vincolo , NON solo duplicare la domanda e ricominciare tutto da capo
Paul R

Risposte:


12

Puoi usare timelimit , è disponibile nell'ubuntu predefinito o puoi compilarlo da solo.

timelimit esegue un comando e termina il processo generato dopo un determinato tempo con un determinato segnale. Prima viene inviato un segnale di "avvertimento", quindi, dopo un timeout, un segnale di "interruzione", simile al modo in cui init (8) opera allo spegnimento.


2
Non è nel mio Ubuntus (desktop 10.10, server 11.04) quindi probabilmente non è un valore predefinito. Ma facilmente afferrato con un veloce sudo aptitude install timelimit. Funziona alla grande una volta installato.
Giorno

7

Ecco un po 'bash di hacking per questo:

grep -qsRw -m1 "parameter" /var &

GREPPID=$!

( sleep 30; kill $GREPPID ) &

fg $GREPPID

Fondamentalmente, avvia la ricerca in background, quindi avvia una subshell che attende 30 secondi e quindi termina il processo di ricerca. Se la ricerca impiega <30s, il processo sarà già morto. Non è una buona idea uccidere un processo che è già morto poiché c'è una possibilità molto piccola che qualcos'altro riutilizzi il pid, ma per qualcosa del genere in genere va bene. Infine, la ricerca viene rimessa in primo piano e verrà eseguita fino al termine o all'eliminazione.


come ottenere $? dal grep in questo caso perché nel mio script prendo $? da grep e verificare se grep corrisponde alla stringa? yael

Non sono sicuro che ci sia un modo semplice per farlo. Inoltre, questo approccio non funziona in uno script in cui bash non ha il controllo del lavoro attivo. Potrebbe essere necessario ricorrere a un po 'di hacker Perl per portare a termine il lavoro in uno script. Hmm ...
Walter Mundt,

è possibile arrivare a questa domanda perl? Yael

4

Crea un nuovo file chiamato "tgrep" e inseriscilo come segue (o chiamalo come vuoi):

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

Quindi, corri chmod a+x tgrep. Ora se vuoi usarlo puoi scrivere

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

Oppure puoi semplicemente usarlo come tgrep (senza il ./ ed essere in grado di usarlo da qualsiasi directory) se lo metti in una directory contenuta nella tua variabile $ PATH (come / home / dan / bin /, se è in la tua variabile $ PATH, altrimenti puoi aggiungerla).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.