如何在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
相关产品推荐
相关产品推荐

