No Ctrl + C, mata o comando atual mas continua executando o script

8

Eu tenho um script bash, em que executo uma linha, durmo por algum tempo e então tail -f meu arquivo de log para verificar se um determinado padrão é visto, pressiono ctrl + c para sair de tail -f e depois mudo para a próxima linha até o script bash terminar a execução:

Aqui está o que eu fiz até agora:

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

O script funciona, mas recebo o erro, o que precisa mudar / o que estou fazendo errado?

./script.sh: line 1: continue: only meaningful in a 'for', 'while', or 'until' loop
    
por cog_n1t1v3 11.02.2015 / 00:02

2 respostas

10

A palavra-chave continue não significa o que você acha que significa. Isso significa continuar para a próxima iteração de um loop. Não faz sentido fora de um loop.

Eu acho que você está procurando

trap ' ' INT

Como você não quer fazer nada na recepção do sinal (além de matar o trabalho em primeiro plano), não coloque nenhum código na armadilha. Você precisa de uma string não vazia, porque a string vazia tem um significado especial: faz com que o sinal seja ignorado.

    
por 11.02.2015 / 00:14
1

O erro ocorre devido a trap 'continue' SIGINT . De help trap :

ARG is a command to be read and executed when the shell receives the signal(s) SIGNAL_SPEC

Assim, seu script tenta executar o comando continue quando receber SIGINT da chamada, mas o continue é usado apenas em loops.

    
por 11.02.2015 / 00:13