Sur Ctrl + C, supprimez la commande actuelle mais continuez à exécuter le script

10

J'ai un script bash, dans lequel j'exécute une ligne, je dors pendant tail -fun certain temps, puis mon fichier journal pour vérifier qu'un certain modèle est vu, j'appuie sur ctrl + c pour sortir tail -f, puis je passe à la ligne suivante jusqu'à ce que le script bash termine l'exécution :

Voici ce que j'ai fait jusqu'à présent:

#!/bin/bash


# capture the hostname
host_name=`hostname -f`


# method that runs tail -f on log_file.log and looks for pattern and passes control to next line on 'ctrl+c'

echo "==================================================="
echo "On $host_name: running some command"
some command here

echo "On $host_name: sleeping for 5s"
sleep 5

# Look for: "pattern" in log_file.log
# trap 'continue' SIGINT
trap 'continue' SIGINT
echo "On $host_name: post update looking for pattern"
tail -f /var/log/hadoop/datanode.log | egrep -i -e "receiving.*src.*dest.*"


# some more sanity check 
echo "On $host_name: checking uptime on process, tasktracker and hbase-regionserver processes...."
sudo supervisorctl status process


# in the end, enable the balancer
# echo balance_switch true | hbase shell

Le script fonctionne mais je reçois l'erreur, qu'est-ce qui doit changer / qu'est-ce que je fais mal?

./script.sh: line 1: continue: only meaningful in a `for', `while', or `until' loop
cog_n1t1v3
la source
également potentiellement pertinent pour les visiteurs de cette page: unix.stackexchange.com/questions/163561/…
pestophage

Réponses:

10

Le continuemot clé ne signifie pas ce que vous pensez qu'il signifie. Cela signifie continuer jusqu'à la prochaine itération d'une boucle. Cela n'a aucun sens en dehors d'une boucle.

Je pense que tu cherches

trap ' ' INT

Puisque vous ne voulez rien faire à la réception du signal (au-delà de la suppression de la tâche de premier plan), ne mettez aucun code dans le piège. Vous avez besoin d'une chaîne non vide, car la chaîne vide a une signification particulière: elle provoque l'ignorance du signal.

Gilles 'SO- arrête d'être méchant'
la source
1
Outrap : INT
Stéphane Chazelas
1

L'erreur survient en raison de trap 'continue' SIGINT. De help trap:

ARG est une commande à lire et à exécuter lorsque le shell reçoit le (s) signal (s) SIGNAL_SPEC

Donc, votre script essaie de faire la continuecommande lors de la réception de l' SIGINTappel mais continueest utilisé uniquement dans les boucles.

Costas
la source