用織夢(mèng)做視頻網(wǎng)站福州百度分公司
Linux筆記之expect和bash腳本監(jiān)聽輸出并在匹配到指定字符串時(shí)發(fā)送中斷信號(hào)
code review!
文章目錄
- Linux筆記之expect和bash腳本監(jiān)聽輸出并在匹配到指定字符串時(shí)發(fā)送中斷信號(hào)
- 1.expect
- 2.bash
1.expect
在Expect腳本中,你可以使用expect
來監(jiān)聽程序輸出,并在輸出匹配特定的模式時(shí)發(fā)送一個(gè)中斷信號(hào)(如Control-C)。以下是一個(gè)使用expect
腳本的基本示例,用于監(jiān)聽特定的輸出并發(fā)送中斷信號(hào):
例1
#!/usr/bin/expect# 啟動(dòng)你的進(jìn)程
spawn your_process# 設(shè)置一個(gè)超時(shí)時(shí)間,防止永遠(yuǎn)等待
set timeout 30# 監(jiān)聽輸出,直到匹配到 "pattern_to_match" 文本
expect "pattern_to_match"# 模式匹配后發(fā)送 Control-C 中斷信號(hào)
send "\003"# 繼續(xù)處理其他事情或結(jié)束腳本
expect eof
your_process
是你想要啟動(dòng)和控制的程序。pattern_to_match
是你期待輸出中出現(xiàn)的文本模式。
例2
#!/usr/bin/expect -f# 設(shè)定無超時(shí)限制
set timeout -1# 啟動(dòng)你的進(jìn)程
spawn ./your_program# 使用expect命令匹配輸出
expect {# 當(dāng)匹配到"特定文本"時(shí),執(zhí)行大括號(hào)內(nèi)的代碼"特定文本" {# 發(fā)送Control-C信號(hào)send "\003"# 可以選擇發(fā)送其他命令或打印信息send_user "已發(fā)送中斷信號(hào)(Control-C)。\n"}# 處理可能出現(xiàn)的其他情況"其他模式1" {# 對(duì)于其他模式1, 執(zhí)行對(duì)應(yīng)操作# ...}"其他模式2" {# 對(duì)于其他模式2, 執(zhí)行對(duì)應(yīng)操作# ...}# 如果發(fā)生超時(shí),處理超時(shí)情況timeout {send_user "操作超時(shí)。\n"exit 1}
}# 處理進(jìn)程結(jié)束
expect eof
在這個(gè)腳本中:
spawn ./your_program
啟動(dòng)你想要監(jiān)控的程序。你需要將./your_program
替換為實(shí)際的程序命令。expect
命令用于監(jiān)聽程序的輸出。"特定文本"
應(yīng)該被替換為你希望匹配的輸出文本。- 當(dāng)輸出匹配到
"特定文本"
時(shí),send "\003"
命令發(fā)送Control-C信號(hào),這通常會(huì)導(dǎo)致大多數(shù)命令行程序終止。 send_user "已發(fā)送中斷信號(hào)(Control-C)。\n"
命令是可選的,用于向用戶反饋信息。"其他模式1"
和"其他模式2"
代表了其他可能匹配的輸出模式,你可以根據(jù)需要添加或修改這些模式及其對(duì)應(yīng)的動(dòng)作。timeout
處理程序如果沒有在預(yù)定時(shí)間內(nèi)給出任何匹配輸出時(shí)的情況。
expect命令可以匹配輸出中的部分字符串,不需要整行或完整字符串匹配!
expect
命令可以匹配輸出中的部分字符串。expect
是一個(gè)用于自動(dòng)化交互式應(yīng)用程序的命令行工具,它使用 Tcl 語(yǔ)言的腳本。其核心功能是等待特定的字符串出現(xiàn)在程序的輸出中,然后根據(jù)腳本中定義的模式進(jìn)行響應(yīng)。
在 expect
腳本中,可以使用 expect
命令來等待特定的文本模式出現(xiàn)。這些模式可以是完整行也可以只是行中的某個(gè)子串。expect
使用了類似于正則表達(dá)式的模式匹配方式來定位輸出中的文本。
以下是一個(gè)簡(jiǎn)單的 expect
腳本示例,該腳本等待部分字符串的出現(xiàn):
#!/usr/bin/expect# 啟動(dòng)某個(gè)交互式命令
spawn some_command# 等待輸出中出現(xiàn) "password:" 子字符串
expect "password:"# 當(dāng)看到 "password:" 時(shí)發(fā)送密碼
send "my_password\r"# 繼續(xù)處理...
在上面的腳本中,expect "password:"
表示腳本會(huì)等待輸出中出現(xiàn) “password:” 這個(gè)子字符串。一旦匹配到,expect
就會(huì)執(zhí)行下一條命令 send
來發(fā)送密碼。
expect
還可以使用更復(fù)雜的正則表達(dá)式來匹配更靈活的模式。例如:
expect {"username:" {send "my_username\r"exp_continue}"password:" {send "my_password\r"}timeout {send_user "Connection timed out\n"exit}
}
在這個(gè)示例中,使用了 expect
的復(fù)合命令語(yǔ)法來匹配多個(gè)可能的輸出,包括 “username:” 和 “password:”,并且也處理了超時(shí)情況。
使用 expect
時(shí),記得模式匹配默認(rèn)是全局的,它會(huì)在整個(gè)輸出中搜索你的字符串,而不需要匹配整行。如果需要更精確的控制,可以使用正則表達(dá)式來指定匹配的條件。
2.bash
在Bash腳本中,你可以使用 trap
命令來捕捉信號(hào)并執(zhí)行一個(gè)命令序列。不過,Bash本身并不是用來做交互式的自動(dòng)化的最佳工具,因?yàn)樗鼪]有像Expect那樣的模式匹配功能。然而,你可以通過結(jié)合使用Bash腳本和工具如 grep
、sed
或 awk
來監(jiān)控進(jìn)程輸出,并使用 kill
命令發(fā)送信號(hào)。
以下是一個(gè)簡(jiǎn)單的例子,這個(gè)例子中,我們使用了一個(gè)循環(huán)來持續(xù)讀取某個(gè)進(jìn)程的輸出,并在發(fā)現(xiàn)特定模式時(shí)發(fā)送SIGINT信號(hào):
#!/bin/bash# 啟動(dòng)你的進(jìn)程并記錄它的PID
your_process &
PID=$!# 使用tail -f來獲取進(jìn)程的實(shí)時(shí)輸出
tail -f your_process.log | \
while read LINE
doecho "$LINE"# 檢查行內(nèi)容是否包含特定模式if [[ "$LINE" == *pattern_to_match* ]]; then# 發(fā)送SIGINT (通常等同于Control-C)kill -SIGINT $PIDbreakfi
done# 等待進(jìn)程結(jié)束
wait $PID
在這個(gè)腳本中,your_process
應(yīng)該被替換為你想要啟動(dòng)的命令,而 your_process.log
應(yīng)該是該進(jìn)程的輸出文件。pattern_to_match
應(yīng)該是你想要匹配的文本模式。
請(qǐng)注意,這些示例可能需要根據(jù)你的實(shí)際需求進(jìn)行調(diào)整。使用Bash來監(jiān)聽和處理實(shí)時(shí)輸出可能會(huì)比較復(fù)雜,尤其是如果輸出速率非??旎蛘吣J奖容^復(fù)雜的時(shí)候。Expect腳本天生就是為了處理這類交互設(shè)計(jì)的,所以通常會(huì)是一個(gè)更好的選擇。