在 Ctrl+C 上,终止当前命令但继续执行脚本

在 Ctrl+C 上,终止当前命令但继续执行脚本

我有一个 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

答案1

continue关键字并不意味着您认为的任何含义。这意味着继续循环的下一次迭代。在循环之外没有任何意义。

我想你正在寻找

trap ' ' INT

由于您不想在收到信号后执行任何操作(除了终止前台作业之外),因此不要在陷阱中放置任何代码。您需要一个非空字符串,因为空字符串具有特殊含义:它会导致信号被忽略。

答案2

错误的产生是由于trap 'continue' SIGINT.从help trap

ARG 是当 shell 收到信号 SIGNAL_SPEC 时要读取和执行的命令

因此,您的脚本尝试在收到呼叫continue时执行命令,但仅在循环中使用。SIGINTcontinue

相关内容