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

如何在zsh中获取后台子进程输出并终止其余进程

Zsh并行子进程监控与终止实现方案

以下是针对需求的具体实现,核心是通过临时文件收集子进程输出、实时监控匹配结果、批量终止剩余进程:

完整脚本示例

#!/usr/bin/env zsh

# 替换为你的实际hash计算逻辑,需确保符合要求的hash单独一行输出
_evaluator() {
    # 模拟耗时计算(替换为你的业务逻辑)
    sleep $((RANDOM % 5))
    # 生成符合32位十六进制格式的hash(替换为你的实际计算)
    local candidate_hash=$(openssl rand -hex 16)
    echo "$candidate_hash"
}

# 主业务流程,接收hash参数后执行
main_process() {
    echo "主进程启动,使用hash: $1"
    # 此处编写你的核心业务逻辑
}

# 并行调度与监控核心逻辑
main() {
    # 创建临时文件存储子进程输出(自动生成唯一文件名)
    local temp_output=$(mktemp)
    # 存储所有子进程PID的数组
    local pids=()

    # 启动5个后台子进程
    for _ in {1..5}; do
        _evaluator >> "$temp_output" 2>&1 &
        pids+=($!)
        echo "启动子进程PID: $!"
    done

    local hash_from_evaluator=""
    # 实时监控临时文件输出,匹配目标正则(替换为你的校验规则)
    tail -f "$temp_output" | while read -r line; do
        if [[ "$line" =~ ^[a-f0-9]{32}$ ]]; then
            hash_from_evaluator="$line"
            echo "捕获有效hash: $hash_from_evaluator"
            
            # 终止所有存活的子进程
            for pid in "${pids[@]}"; do
                kill -0 "$pid" 2>/dev/null && { kill "$pid"; echo "终止子进程PID: $pid"; }
            done
            
            # 停止tail监控进程
            pkill -P $$ tail
            break
        fi
    done

    # 清理临时文件
    rm -f "$temp_output"

    # 启动主进程逻辑
    if [[ -n "$hash_from_evaluator" ]]; then
        main_process "$hash_from_evaluator"
    else
        echo "未获取到有效hash"
        exit 1
    fi
}

main

关键逻辑说明

  • 临时文件收集输出:用mktemp生成唯一临时文件,避免多实例冲突,所有子进程的输出都追加到该文件。
  • PID数组记录:启动每个后台进程时,用$!获取进程ID并存入数组,后续用于批量终止。
  • 实时监控匹配:通过tail -f实时读取临时文件,结合zsh内置的[[ ... =~ ... ]]正则匹配,捕获符合要求的hash值。
  • 批量终止进程:遍历PID数组,先用kill -0检查进程是否存活,存活则执行kill终止;同时终止tail监控进程,避免资源浪费。
  • 资源清理:完成后删除临时文件,避免磁盘残留。

适配调整点

  1. 将_evaluator函数内的模拟逻辑替换为你的实际hash计算代码,确保符合要求的hash以单独一行输出。
  2. 修改正则表达式^[a-f0-9]{32}$为你需要的校验规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 17:53:14