GNU/Linux >> Tutoriels Linux >  >> Linux

Tuer le programme après avoir sorti une ligne donnée, à partir d'un script shell

Si votre programme se termine sur SIGPIPE (ce qui est l'action par défaut), il devrait suffire de diriger la sortie vers un lecteur qui se fermera à la lecture de cette ligne.

Cela pourrait donc être aussi simple que

$ program | sed -e '/Suitable text from the line/q'

Si vous souhaitez supprimer la sortie par défaut, utilisez

$ program | sed -n -e '/Suitable text from the line/q'

De même, si l'on veut s'arrêter après un certain nombre de lignes, on peut utiliser head à la place de sed, par exemple

$ program | head -n$NUMBER_OF_LINES_TO_STOP_AFTER

L'heure exacte à laquelle la mise à mort se produit fait dépendent du comportement de mise en mémoire tampon du terminal, comme stardt le suggère dans les commentaires.


Un script wrapper comme celui-ci est une approche standard. Le script exécute le programme en arrière-plan, puis boucle, vérifiant le fichier journal toutes les minutes pour une chaîne. Si la chaîne est trouvée, le programme d'arrière-plan est tué et le script se ferme.

command="prog -foo -whatever"
log="prog.log"
match="this is the what i want to match"

$command > "$log" 2>&1 &
pid=$!

while sleep 60
do
    if fgrep --quiet "$match" "$log"
    then
        kill $pid
        exit 0
    fi
done

Comme alternative à la réponse de dmckee, le grep commande avec le -m option (voir par exemple cette page de manuel) peut également être utilisée :

compbio | grep -m 1 "Text to match"

pour s'arrêter lorsqu'une ligne correspondant au texte est trouvée ou

compbio | grep -v -m 10 "Text to match"

attendre 10 lignes qui ne correspondent pas au texte donné.


Linux
  1. Comment passer un argument de ligne de commande dans un script shell ?

  2. D'où est exécuté un script Shell ?

  3. Comment exécuter des scripts Python à partir du shell

  4. Comment tuer un processus enfant après un délai d'attente donné dans Bash?

  5. Shell Script, lu sur la même ligne après avoir renvoyé un message

Programmer le matériel à partir de la ligne de commande Linux

Script Bash vers Center Fortune/texte depuis Stdin/pipe ?

Exécuter les commandes Shell à partir du programme exécuté dans WINE

Exécuter un script shell dans un nouveau terminal à partir du terminal actuel

Obtenir une ligne spécifique à partir d'un fichier texte en utilisant uniquement un script shell

matlab exécute le script à partir de la ligne de commande linux