Ich habe ein Bash-Skript, in dem ich eine Zeile ausführe, einige Zeit schlafe und dann tail -f
meine Protokolldatei, um zu überprüfen, ob ein bestimmtes Muster angezeigt wird. Ich drücke Strg + C, um tail -f
die nächste Zeile zu verlassen, bis das Bash-Skript die Ausführung beendet hat ::
Folgendes habe ich bisher getan:
#!/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
Das Skript funktioniert, aber ich bekomme den Fehler, was muss geändert werden / was mache ich falsch?
./script.sh: line 1: continue: only meaningful in a `for', `while', or `until' loop
Antworten:
Das
continue
Schlüsselwort bedeutet nicht, was Sie denken, dass es bedeutet. Dies bedeutet, dass Sie mit der nächsten Iteration einer Schleife fortfahren. Außerhalb einer Schleife macht es keinen Sinn.Ich denke du suchst
Da Sie beim Empfang des Signals nichts tun möchten (außer den Vordergrundjob zu beenden), geben Sie keinen Code in die Falle ein. Sie benötigen eine nicht leere Zeichenfolge, da die leere Zeichenfolge eine besondere Bedeutung hat: Das Signal wird ignoriert.
quelle
trap : INT
Der Fehler entsteht durch
trap 'continue' SIGINT
. Vonhelp trap
:Ihr Skript versucht also,
continue
beim Empfang einesSIGINT
Anrufs einen Befehl auszuführen , dercontinue
jedoch nur in Schleifen verwendet wird.quelle