使用 bash 進(jìn)行服務(wù)閑置檢查

本文鏈接個(gè)人站 | 簡(jiǎn)書(shū) | CSDN
版權(quán)聲明:除特別聲明外副签,本博客文章均采用 BY-NC-SA 許可協(xié)議帆疟。轉(zhuǎn)載請(qǐng)注明出處。

重啟服務(wù)之前往往需要檢查一下是否還有未處理完的請(qǐng)求。此時(shí)可以使用 ss 命令查看端口是否還有 TCP 連接施流。例如:

pi@raspberrypi:~ $ ss -nt state established src 192.168.1.26:8888
Recv-Q Send-Q Local Address:Port               Peer Address:Port              
0      0      192.168.1.26:8888               192.168.1.25:50390

我們可以統(tǒng)計(jì)這條命令輸出的行數(shù),若小于 2鄙信,則說(shuō)明服務(wù)已經(jīng)處于閑置狀態(tài)瞪醋。腳本如下:

#!/bin/bash

# 獲取本機(jī) IP
host=$(ifconfig -a | grep inet | grep -v 127.0.0.1 | grep -v inet6 | awk '{print $2}' | tr -d "addr:")
# 超時(shí)時(shí)間
timeout=3600

check(){
  port="$1"
  begin=$(date +'%s')
  while true
  do
    current=$(date +'%s')
    duration=$(($current-$begin))
    if [[ $duration -gt $timeout ]]; then
      # 超時(shí)退出
      result="TIMEOUT"
      code=1
      break
    count=$(ss -nt state established src $host:$port | wc -l)
    if [[ $count -lt 2 ]]; then
      # 閑置退出
      result="IDLE"
      code=0
      break
    else
      sleep 2
    fi
  done
  echo "the result is $result"
  return $code
}

if [[ $# -ne 1 ]]; then
  echo "Usage: $0 [port]"
  exit 1
else
  check "$1"
  exit $?
fi

如果 ss 命令發(fā)生錯(cuò)誤怎么辦?為了進(jìn)一步完善腳本装诡,我們需要加入異常處理機(jī)制银受。bash 中沒(méi)有 try...catch.. 之類(lèi)的語(yǔ)法,那么該如何捕獲異常呢鸦采?下面介紹兩個(gè)特殊的寫(xiě)法:

  • command1 || command2:當(dāng)且僅當(dāng) command1 發(fā)生錯(cuò)誤時(shí)執(zhí)行 command2宾巍。
  • command1 && command2:當(dāng)且僅當(dāng) command1 沒(méi)有錯(cuò)誤時(shí)執(zhí)行 command2

利用上面這兩個(gè)特性赖淤,我們引入異常處理蜀漆,把腳本改寫(xiě)成:

#!/bin/bash

set -o pipefail

# 獲取本機(jī) IP
host=$(ifconfig -a | grep inet | grep -v 127.0.0.1 | grep -v inet6 | awk '{print $2}' | tr -d "addr:")
# 超時(shí)時(shí)間
timeout=3600

check(){
  port="$1"
  begin=$(date +'%s')
  while true
  do
    current=$(date +'%s')
    duration=$(($current-$begin))
    if [[ $duration -gt $timeout ]]; then
      # 超時(shí)退出
      result="TIMEOUT"
      code=1
      break
    {
      count=$(ss -nt state established src $host:$port | wc -l) &&
      if [[ $count -lt 2 ]]; then
        # 閑置退出
        result="IDLE"
        code=0
        break
      else
        sleep 2
      fi
    }||{
      # 異常退出
      result="ERROR"
      code=1
      break
    }
  done
  echo "the result is $result"
  return $code
}

if [[ $# -ne 1 ]]; then
  echo "Usage: $0 [port]"
  exit 1
else
  check "$1"
  exit $?
fi

ss -nt state established src $host:$port | wc -l 利用了管道,而默認(rèn)情況下咱旱,前面的 ss 命令出錯(cuò)并不會(huì)影響后面的 wc 命令的執(zhí)行确丢。為了捕獲管道中的錯(cuò)誤,我們?cè)谀_本開(kāi)頭添加了 set -o pipefail吐限。

現(xiàn)在我們的腳本可以檢測(cè)一個(gè)服務(wù)實(shí)例是否閑置鲜侥。如果我們需要同時(shí)檢查多個(gè)實(shí)例該怎么辦?如果可以并行地執(zhí)行我們的 check 函數(shù)就好了诸典。我們知道描函,在一條命令后面加上 &,就可以將它放到子 shell 中執(zhí)行狐粱,達(dá)到多線(xiàn)程的效果舀寓。進(jìn)一步地,我們可以用 wait 命令實(shí)現(xiàn)多線(xiàn)程同步肌蜻』ツ梗基于此,我們給出可以同時(shí)檢查多個(gè)實(shí)例的 check_all 函數(shù):

check_all(){
  ports="$#"
  anyfailed=0
  for port in $ports
  do
    check $port &
  done
  for pid in $(jobs -p)
  do
    wait $pid
    if [[ $? -ne 0 ]]; then
      anyfailed=1
    fi
  done
  return $anyfailed
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蒋搜,一起剝皮案震驚了整個(gè)濱河市篡撵,隨后出現(xiàn)的幾起案子判莉,更是在濱河造成了極大的恐慌,老刑警劉巖育谬,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件券盅,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡膛檀,警方通過(guò)查閱死者的電腦和手機(jī)锰镀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)宿刮,“玉大人互站,你說(shuō)我怎么就攤上這事〗┤保” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵踩叭,是天一觀(guān)的道長(zhǎng)磕潮。 經(jīng)常有香客問(wèn)我,道長(zhǎng)容贝,這世上最難降的妖魔是什么自脯? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮斤富,結(jié)果婚禮上膏潮,老公的妹妹穿的比我還像新娘。我一直安慰自己满力,他們只是感情好焕参,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著油额,像睡著了一般叠纷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上潦嘶,一...
    開(kāi)封第一講書(shū)人閱讀 51,718評(píng)論 1 305
  • 那天涩嚣,我揣著相機(jī)與錄音,去河邊找鬼掂僵。 笑死航厚,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的锰蓬。 我是一名探鬼主播幔睬,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼互妓!你這毒婦竟也來(lái)了溪窒?” 一聲冷哼從身側(cè)響起坤塞,我...
    開(kāi)封第一講書(shū)人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎澈蚌,沒(méi)想到半個(gè)月后摹芙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宛瞄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年浮禾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片份汗。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡盈电,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出杯活,到底是詐尸還是另有隱情匆帚,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布旁钧,位于F島的核電站吸重,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏歪今。R本人自食惡果不足惜嚎幸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望寄猩。 院中可真熱鬧嫉晶,春花似錦、人聲如沸田篇。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)斯辰。三九已至舶担,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間彬呻,已是汗流浹背衣陶。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留闸氮,地道東北人剪况。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蒲跨,于是被迫代替她去往敵國(guó)和親译断。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容