Linux笔记之expect和bash脚本监听输出并在匹配到指定字符串时发送中断信号
Linux笔记之expect和bash脚本监听输出并在匹配到指定字符串时发送中断信号
code review!
文章目录
- Linux笔记之expect和bash脚本监听输出并在匹配到指定字符串时发送中断信号
- 1.expect
- 2.bash
1.expect
在Expect脚本中,你可以使用expect来监听程序输出,并在输出匹配特定的模式时发送一个中断信号(如Control-C)。以下是一个使用expect脚本的基本示例,用于监听特定的输出并发送中断信号:
例1
#!/usr/bin/expect# 启动你的进程
spawn your_process# 设置一个超时时间,防止永远等待
set timeout 30# 监听输出,直到匹配到 "pattern_to_match" 文本
expect "pattern_to_match"# 模式匹配后发送 Control-C 中断信号
send "\003"# 继续处理其他事情或结束脚本
expect eof
your_process 是你想要启动和控制的程序。pattern_to_match 是你期待输出中出现的文本模式。
例2
#!/usr/bin/expect -f# 设定无超时限制
set timeout -1# 启动你的进程
spawn ./your_program# 使用expect命令匹配输出
expect {# 当匹配到"特定文本"时,执行大括号内的代码"特定文本" {# 发送Control-C信号send "\003"# 可以选择发送其他命令或打印信息send_user "已发送中断信号(Control-C)。\n"}# 处理可能出现的其他情况"其他模式1" {# 对于其他模式1, 执行对应操作# ...}"其他模式2" {# 对于其他模式2, 执行对应操作# ...}# 如果发生超时,处理超时情况timeout {send_user "操作超时。\n"exit 1}
}# 处理进程结束
expect eof
在这个脚本中:
spawn ./your_program启动你想要监控的程序。你需要将./your_program替换为实际的程序命令。expect命令用于监听程序的输出。"特定文本"应该被替换为你希望匹配的输出文本。- 当输出匹配到
"特定文本"时,send "\003"命令发送Control-C信号,这通常会导致大多数命令行程序终止。 send_user "已发送中断信号(Control-C)。\n"命令是可选的,用于向用户反馈信息。"其他模式1"和"其他模式2"代表了其他可能匹配的输出模式,你可以根据需要添加或修改这些模式及其对应的动作。timeout处理程序如果没有在预定时间内给出任何匹配输出时的情况。
expect命令可以匹配输出中的部分字符串,不需要整行或完整字符串匹配!
expect 命令可以匹配输出中的部分字符串。expect 是一个用于自动化交互式应用程序的命令行工具,它使用 Tcl 语言的脚本。其核心功能是等待特定的字符串出现在程序的输出中,然后根据脚本中定义的模式进行响应。
在 expect 脚本中,可以使用 expect 命令来等待特定的文本模式出现。这些模式可以是完整行也可以只是行中的某个子串。expect 使用了类似于正则表达式的模式匹配方式来定位输出中的文本。
以下是一个简单的 expect 脚本示例,该脚本等待部分字符串的出现:
#!/usr/bin/expect# 启动某个交互式命令
spawn some_command# 等待输出中出现 "password:" 子字符串
expect "password:"# 当看到 "password:" 时发送密码
send "my_password\r"# 继续处理...
在上面的脚本中,expect "password:" 表示脚本会等待输出中出现 “password:” 这个子字符串。一旦匹配到,expect 就会执行下一条命令 send 来发送密码。
expect 还可以使用更复杂的正则表达式来匹配更灵活的模式。例如:
expect {"username:" {send "my_username\r"exp_continue}"password:" {send "my_password\r"}timeout {send_user "Connection timed out\n"exit}
}
在这个示例中,使用了 expect 的复合命令语法来匹配多个可能的输出,包括 “username:” 和 “password:”,并且也处理了超时情况。
使用 expect 时,记得模式匹配默认是全局的,它会在整个输出中搜索你的字符串,而不需要匹配整行。如果需要更精确的控制,可以使用正则表达式来指定匹配的条件。
2.bash
在Bash脚本中,你可以使用 trap 命令来捕捉信号并执行一个命令序列。不过,Bash本身并不是用来做交互式的自动化的最佳工具,因为它没有像Expect那样的模式匹配功能。然而,你可以通过结合使用Bash脚本和工具如 grep、sed 或 awk 来监控进程输出,并使用 kill 命令发送信号。
以下是一个简单的例子,这个例子中,我们使用了一个循环来持续读取某个进程的输出,并在发现特定模式时发送SIGINT信号:
#!/bin/bash# 启动你的进程并记录它的PID
your_process &
PID=$!# 使用tail -f来获取进程的实时输出
tail -f your_process.log | \
while read LINE
doecho "$LINE"# 检查行内容是否包含特定模式if [[ "$LINE" == *pattern_to_match* ]]; then# 发送SIGINT (通常等同于Control-C)kill -SIGINT $PIDbreakfi
done# 等待进程结束
wait $PID
在这个脚本中,your_process 应该被替换为你想要启动的命令,而 your_process.log 应该是该进程的输出文件。pattern_to_match 应该是你想要匹配的文本模式。
请注意,这些示例可能需要根据你的实际需求进行调整。使用Bash来监听和处理实时输出可能会比较复杂,尤其是如果输出速率非常快或者模式比较复杂的时候。Expect脚本天生就是为了处理这类交互设计的,所以通常会是一个更好的选择。

相关文章:
Linux笔记之expect和bash脚本监听输出并在匹配到指定字符串时发送中断信号
Linux笔记之expect和bash脚本监听输出并在匹配到指定字符串时发送中断信号 code review! 文章目录 Linux笔记之expect和bash脚本监听输出并在匹配到指定字符串时发送中断信号1.expect2.bash 1.expect 在Expect脚本中,你可以使用expect来监听程序输出,…...
项目02《游戏-12-开发》Unity3D
基于 项目02《游戏-11-开发》Unity3D , 任务:实现场景怪物自动巡航 , 首先在场景中创建小球命名为路径点WayPoint0, 取消小球的碰撞器Collider, 再复制两个改名为WayPoint1 和 WayPoint2 , 在…...
记一次面试题
1.Php 私有化包(composer)的部署 1. 创建你的PHP包 确定你的包的功能和命名空间。 创建一个新的目录并初始化一个Git仓库。 使用composer init命令创建一个composer.json文件,并定义你的包名、版本、依赖等信息。 2. 开发并测试你的包 在本地…...
Rust入门2——随机数
文章目录 一、生成随机数二、比较两个数相等 简单列出两个Rust的小例子 一、生成随机数 在Cargo.toml的dependencies中引入rand,指定rand的版本 [dependencies] rand "^0.3.14"之后在主函数中调用rand函数,生成随机数 use rand::Rng; f…...
c#: 表达式树的简化
环境: .net 6 一、问题? 有下面的表达式: var nums new List<int> { 1, 2, 3 }; Expression<Func<int, bool>> exp i > i > nums.Max();我们知道,它其实就是:exp i > i > 3; 那么…...
13. UE5 RPG限制Attribute的值的范围以及生成结构体
前面几章,我们实现了通过GameplayEffect对Attribute值的修改,比如血量和蓝量,我们都是有一个最大血量和最大蓝量去限制它的最大值,而且血量和蓝量最小值不会小于零。之前我们是没有实现相关限制的,接下来,我…...
UE4运用C++和框架开发坦克大战教程笔记(十九)(第58~60集)完结
UE4运用C和框架开发坦克大战教程笔记(十九)(第58~60集)完结 58. 弹窗显示与隐藏59. UI 面板销毁60. 框架完成与总结 58. 弹窗显示与隐藏 这节课我们先来补全 TransferMask() 里对于 Overlay 布局类型面板的遮罩转移逻辑ÿ…...
ModuleNotFoundError: No module named ‘_ctypes‘报错解决方案
1、须命令安装libbffi-devel软件包: yum install libffi-devel -y2、安装完后再重装python3,无须卸载 找到之前的python3安装包,如果安装包删除了通过 history | grep python命令找到最初安装时的包下载的命令下载,保证版本一样&…...
【服务器数据恢复】服务器RAID模块硬件损坏的数据恢复案例
服务器数据恢复环境&故障: 某品牌服务器中有一组由数块SAS硬盘组建的RAID5磁盘阵列,服务器操作系统是WINDOWS SERVER,服务器中存放企业数据,无数据库文件。 服务器出故障之前出现过几次意外断电的情况,服务器断电…...
spring boot3x登录开发-上(整合jwt)
⛰️个人主页: 蒾酒 🔥系列专栏:《spring boot实战》 🌊山高路远,行路漫漫,终有归途。 目录 前置条件 jwt简介 导依赖 编写jwt工具类 1.配置项直接嵌入代码,通过类名.静态方法使用 2.配置项写到…...
git 克隆拉取代码出现私钥权限问题。
问题反馈: rootdd:~/android/boost-1.74-for-android-r20b# git clone https://github.com/liulilittle/boost-1.74-for-android-r20b.git Cloning into boost-1.74-for-android-r20b... WARNING: UNPROTECTED PRIVATE KEY FILE! Permissions 0777 for /root/…...
【5G NR】【一文读懂系列】移动通讯中使用的信道编解码技术-卷积码原理
目录 一、引言 二、卷积编码的发展历史 2.1 卷积码的起源 2.2 主要发展阶段 2.3 重要里程碑 三、卷积编码的基本概念 3.1 基本定义 3.2 编码器框图 3.3 编码多项式 3.4 网格图(Trellis)描述 四、MATLAB示例 一、引言 卷积编码,作为数字通信领域中的一项…...
揭开Markdown的秘籍:标题|文字样式|列表
🌈个人主页:聆风吟 🔥系列专栏:Markdown指南、网络奇遇记 🔖少年有梦不应止于心动,更要付诸行动。 文章目录 📋前言一. ⛳️Markdown 标题二. ⛳️Markdown 文字样式2.1 🔔斜体2.2 &…...
移动最小二乘法
移动最小二乘法(Moving Least Square,MLS)主要应用于曲线与曲面拟合,该方法基于紧支撑加权函数(即函数值只在有限大小的封闭域中定义大于零,而在域外则定义为零)和多项式基函数,通过…...
【LeetCode】37. 解数独(困难)——代码随想录算法训练营Day30
题目链接:37. 解数独 题目描述 编写一个程序,通过填充空格来解决数独问题。 数独的解法需 遵循如下规则: 数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。&…...
VUE学习——属性绑定
属性绑定,就是给html添加id、class这样类似的操作。 <template><div v-bind:id"dynamicId"><div v-bind:class"dynamicClass">Test</div></div> </template><script>export default{data(){return{…...
vue3 之 通用组件统一注册全局
components/index.js // 把components中的所组件都进行全局化注册 // 通过插件的方式 import ImageView from ./ImageView/index.vue import Sku from ./XtxSku/index.vue export const componentPlugin {install (app) {// app.component(组件名字,组件配置对象)…...
[Java][算法 双指针]Day 02---LeetCode 热题 100---04~07
LeetCode 热题 100---04~07 第一题:移动零 思路 找到每一个为0的元素 然后移到数组的最后 但是需要注意的是 要在给定的数组原地进行修改 并且其他非零元素的相对顺序不能改变 我们采用双指针法 定义两个指针i和j i和j一开始分别都在0索引位置 然后判断j所…...
【问题解决】如何将一个服务器的docker迁移到另一个服务器
要将Docker容器从一台机器迁移到另一台机器,可以按照以下步骤操作: 在机器A上提交容器为镜像: 使用docker commit命令将运行中的容器保存为新的镜像。这里需要容器的ID或名称,以及你想要命名的目标镜像名。 docker commit [容器…...
C++单例模式详解
目录 0. 前言 1. 懒汉式单例模式 1.1 最简单的单例模式 1.2 防止内存泄漏 1.2.1 智能指针的方法 1.2.2 静态嵌套的方法 1.3 保证线程安全 1.4 C11版本的优雅解决方案 2. 饿汉式单例模式 0. 前言 起因是在程序中重复声明了一个单例模式的变量,后来程序怎么调…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
