Beenden Sie bei Strg + C den aktuellen Befehl, führen Sie das Skript jedoch weiter aus


10

Ich habe ein Bash-Skript, in dem ich eine Zeile ausführe, einige Zeit schlafe und dann tail -fmeine Protokolldatei, um zu überprüfen, ob ein bestimmtes Muster angezeigt wird. Ich drücke Strg + C, um tail -fdie 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

auch potenziell relevant für Besucher dieser Seite: unix.stackexchange.com/questions/163561/…
pestophagous

Antworten:


10

Das continueSchlü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

trap ' ' INT

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.


1
Odertrap : INT
Stéphane Chazelas

1

Der Fehler entsteht durch trap 'continue' SIGINT. Von help trap:

ARG ist ein Befehl, der gelesen und ausgeführt werden muss, wenn die Shell die Signale SIGNAL_SPEC empfängt

Ihr Skript versucht also, continuebeim Empfang eines SIGINTAnrufs einen Befehl auszuführen , der continuejedoch nur in Schleifen verwendet wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.