Bash

在 Ctrl+C 上,終止目前命令但繼續執行腳本

  • November 27, 2016

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

continue關鍵字並不意味著您認為它意味著什麼。這意味著繼續循環的下一次迭代。在循環之外沒有任何意義。

我想你正在尋找

trap ' ' INT

由於您不想在接收到信號後做任何事情(除了終止前台工作),因此不要在陷阱中添加任何程式碼。您需要一個非空字元串,因為空字元串具有特殊含義:它會導致信號被忽略。

錯誤是由於trap 'continue' SIGINT. 來自help trap

ARG 是當 shell 接收到信號 SIGNAL_SPEC 時要讀取和執行的命令

continue因此,您的腳本在收到SIGINT呼叫時嘗試執行命令,但continue僅在循環中使用。

引用自:https://unix.stackexchange.com/questions/184124