На Ctrl + C убить текущую команду, но продолжить выполнение сценария


10

У меня есть скрипт bash, в котором я выполняю строку, некоторое время сплю, а затем tail -fмой файл журнала, чтобы убедиться, что виден определенный шаблон, я нажимаю ctrl + c, чтобы выйти из него, tail -fа затем перехожу на следующую строку, пока скрипт bash не завершит выполнение :

Вот что я сделал до сих пор:

#!/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

Скрипт работает, но я получаю ошибку, что нужно изменить / что я делаю не так?

./script.sh: line 1: continue: only meaningful in a `for', `while', or `until' loop

также потенциально имеет отношение к посетителям этой страницы: unix.stackexchange.com/questions/163561/…
pestophagous

Ответы:


10

continueКлючевое слово не означает , что вы думаете , что это означает. Это означает переход к следующей итерации цикла. Это не имеет смысла вне цикла.

Я думаю, что вы ищете

trap ' ' INT

Поскольку вы не хотите ничего делать при получении сигнала (кроме убийства на переднем плане), не ставьте код в ловушку. Вам нужна непустая строка, потому что пустая строка имеет особое значение: она вызывает игнорирование сигнала.


1
Илиtrap : INT
Стефан Шазелас

1

Ошибка возникает из-за trap 'continue' SIGINT. От help trap:

ARG - это команда, которая должна быть прочитана и выполнена, когда оболочка получает сигнал (ы). SIGNAL_SPEC

Таким образом, ваш скрипт пытается выполнить continueкоманду при получении SIGINTвызова, но continueон используется только в циклах.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.