Tuer le processus après qu'il ait été autorisé à s'exécuter pendant un certain temps

13

Je veux limiter la grepdurée pendant laquelle une commande de processus est autorisée à s'exécuter ou à être vivante.

Par exemple. Je souhaite effectuer les opérations suivantes:

grep -qsRw -m1 "parameter" /var

Mais avant d'exécuter la grepcommande, je veux limiter la durée de vie du grepprocessus, par exemple pas plus de 30 secondes.

Comment puis-je faire cela?

Et si c'est le cas, comment puis-je retourner ou réinitialiser pour n'avoir aucune limite de temps par la suite.

Yael
la source
3
tu ne l'as pas déjà demandé? stackoverflow.com/questions/3061377/…
Pas cet autre quastion car je n'ai pas de réponse sur le quastion d'origine Yael
4
@yael: vous avez déjà utilisé une bonne solution auparavant, timeoutet vous avez même reçu des instructions pour l'installer. Il est impoli d'ignorer cette réponse, puis de dupliquer votre question.
Paul R
désolé mais NON je ne veux rien installer sur mon système THX yael
5
@yael: alors vous devez mettre à jour votre question d'origine pour inclure cette contrainte , PAS simplement dupliquer la question et recommencer à nouveau
Paul R

Réponses:

12

Vous pouvez utiliser timelimit , il est disponible dans l'ubuntu par défaut ou vous pouvez le compiler vous-même.

timelimit exécute une commande et termine le processus généré après un temps donné avec un signal donné. Un signal "d'avertissement" est envoyé en premier, puis, après un délai d'attente, un signal "kill", similaire à la façon dont init (8) fonctionne à l'arrêt.

feniix
la source
2
Ce n'est pas dans mon Ubuntus (bureau 10.10, serveur 11.04) donc ce n'est probablement pas un défaut. Mais facilement saisi avec un rapide sudo aptitude install timelimit. Fonctionne très bien une fois installé.
Jour
7

Voici quelques bash légèrement hackers pour cela:

grep -qsRw -m1 "parameter" /var &

GREPPID=$!

( sleep 30; kill $GREPPID ) &

fg $GREPPID

Fondamentalement, il démarre la recherche en arrière-plan, puis démarre un sous-shell qui attend 30 secondes, puis tue le processus de recherche. Si la recherche dure moins de 30 secondes, le processus sera déjà mort. Ce n'est pas une bonne idée de tuer un processus qui est déjà mort car il y a très peu de chances que quelque chose d'autre réutilise le pid, mais pour quelque chose comme ça, c'est généralement bien. Enfin, la recherche est remise au premier plan et se poursuivra jusqu'à ce qu'elle se termine ou soit supprimée.

Walter Mundt
la source
comment obtenir le $? du grep dans ce cas car dans mon script je prends le $? de grep et vérifier si grep correspond à la chaîne? yael
Je ne suis pas sûr qu'il existe un moyen simple de le faire. De plus, cette approche ne fonctionne pas dans un script où bash n'a pas de contrôle de travail actif. Vous devrez peut-être recourir à un peu de piratage Perl pour faire le travail dans un script. Hmm ...
Walter Mundt
il est possible d'arriver cette question à perl? Yael
4

Créez un nouveau fichier appelé "tgrep" et mettez-y ce qui suit (ou appelez-le comme vous voulez):

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

Ensuite, exécutez chmod a+x tgrep. Maintenant, si vous voulez l'utiliser, vous pouvez taper

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

Ou vous pouvez simplement l'utiliser comme tgrep (sans le ./ et pouvoir l'utiliser à partir de n'importe quel répertoire) si vous le placez dans un répertoire contenu dans votre variable $ PATH (comme / home / dan / bin /, si c'est dans votre variable $ PATH, sinon vous pouvez l'ajouter).

Jarvin
la source