You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在screen会话输出出现指定关键词时终止该会话?

问题分析

你的方案失效的核心原因:

  • script2.sh用screen -dmS启动的会话是后台脱离终端的模式,这个会话的输出不会流向script2.sh的标准输出,所以script3.sh里的管道/home/user/script2.sh | tee ...根本捕获不到script1.sh的任何输出。grep -m 1 "violence"永远匹配不到目标内容,自然不会执行后面的终止会话命令。
  • 就算触发了终止逻辑,你当前的代码会杀掉所有screen会话,这和只终止mysession的预期不符。
修正方案

下面两种实现方式任选其一即可:

方式一:通过日志文件监控输出

修改script2.sh

让screen会话把输出写入日志文件,方便后续监控:

#!/bin/bash
# 日志文件路径可自行修改
LOG_FILE="/tmp/mysession_output.log"
# 启动screen会话,同时将script1的输出写入日志
screen -dmS mysession bash -c "/home/user/script1.sh | tee $LOG_FILE"

修改script3.sh

先启动会话,再监控日志文件直到出现目标词,最后终止指定会话:

#!/bin/bash
LOG_FILE="/tmp/mysession_output.log"
# 启动screen会话
/home/user/script2.sh
# 实时监控日志,匹配到"violence"后立即停止监控
tail -f "$LOG_FILE" | grep -m 1 "violence"
# 终止指定的mysession会话
screen -S mysession -X quit
# 可选:清理日志文件
rm -f "$LOG_FILE"

方式二:直接关联screen会话输出(无需日志文件)

如果不想用日志文件,可以直接让screen会话的输出传递到当前终端,同时后台运行:

合并script2.sh和script3.sh为单个脚本

#!/bin/bash
# 启动screen会话,重定向输出到标准输出并后台运行
screen -S mysession -L -Logfile /dev/stdout /home/user/script1.sh 2>&1 &
# 监控输出,匹配到目标词后终止会话
grep -m 1 "violence" <(tail -f /dev/stdout)
screen -S mysession -X quit

注:这种方式依赖screen的日志重定向功能,部分环境可能需要调整参数。

验证方法

执行修改后的脚本,当script1.sh输出"violence"后,执行screen -ls应该看不到mysession会话,说明终止成功。

内容的提问来源于stack exchange,提问作者Benedix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 13:25:02