Pada Ctrl + C, bunuh perintah saat ini tetapi terus jalankan skrip

10

Saya memiliki skrip bash, di mana saya mengeksekusi sebuah baris, sleep untuk beberapa saat dan kemudian tail -ffile log saya untuk memverifikasi pola tertentu terlihat, saya tekan ctrl + c untuk keluar dari tail -fdan kemudian pindah ke baris berikutnya sampai skrip bash selesai dieksekusi :

Inilah yang telah saya lakukan sejauh ini:

#!/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 berfungsi tetapi saya mendapatkan kesalahan, apa yang perlu diubah / apa yang saya lakukan salah?

./script.sh: line 1: continue: only meaningful in a `for', `while', or `until' loop
cog_n1t1v3
sumber
juga berpotensi relevan bagi pengunjung halaman ini: unix.stackexchange.com/questions/163561/…
pestophagous

Jawaban:

10

Kata continuekunci tidak berarti apa pun yang Anda pikir artinya. Itu berarti melanjutkan ke iterasi loop berikutnya. Tidak masuk akal di luar lingkaran.

Saya pikir Anda sedang mencari

trap ' ' INT

Karena Anda tidak ingin melakukan apa pun setelah menerima sinyal (selain membunuh pekerjaan latar depan), jangan masukkan kode ke dalam jebakan. Anda memerlukan string yang tidak kosong, karena string kosong memiliki makna khusus: itu menyebabkan sinyal diabaikan.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
1
Atautrap : INT
Stéphane Chazelas
1

Kesalahan muncul karena trap 'continue' SIGINT. Dari help trap:

ARG adalah perintah untuk dibaca dan dieksekusi ketika shell menerima sinyal SIGNAL_SPEC

Jadi skrip Anda mencoba melakukan continueperintah ketika menerima SIGINTpanggilan tetapi continuehanya digunakan dalam loop.

Costas
sumber