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

后台进程完成状态校验及进程ID映射实现技术咨询

完善后台进程检查脚本需求与实现

需求背景

我们在脚本中后台运行函数,将进程ID(PID)存储至文件:每个文件存储6个后台进程ID,共6个文件。需实现以下核心需求:

  • 校验所有进程是否完成任务,为执行后续函数做准备
  • 通过无限循环持续检查进程是否终止
  • 进程停止后执行进程映射操作

原有脚本问题

现有检查脚本仅读取每个PID文件的首行内容,无法覆盖文件内所有进程ID,脚本内容如下:

while true; do
   for file in $(ls status); do
    while read line; do
       pgrep -x $line
    if [[ "$?" = "1" ]]; then
        log "$line is completed"
    fi
    break
    done < status/$file
    done
done

修改后的完整脚本

以下是修复后的脚本,可覆盖所有PID检查,并实现进程结束后的映射操作:

#!/bin/bash

# 假设log函数用于记录日志,process_mapping为进程停止后执行的映射操作函数
while true; do
    # 遍历status目录下所有PID文件,用glob替代ls避免特殊字符问题
    for pid_file in status/*; do
        # 跳过非文件类型(如目录为空时的通配符本身)
        [[ -f "$pid_file" ]] || continue
        
        # 逐行读取文件中的每个PID
        while read -r pid; do
            # 检查PID对应的进程是否存活,-x精确匹配PID,输出重定向到/dev/null避免冗余输出
            if ! pgrep -x "$pid" > /dev/null; then
                log "$pid 已完成任务"
                # 执行进程映射操作,替换为你的实际逻辑
                process_mapping "$pid"
                
                # 可选:从文件中移除已完成的PID,避免重复检查
                # sed -i "/^$pid$/d" "$pid_file"
            fi
        done < "$pid_file"
    done
    
    # 可选:添加检查间隔,降低CPU占用,可根据需求调整时长
    sleep 1
done

关键修改点说明

  1. 移除break语句:原脚本的break导致内层循环仅读取文件首行就退出,移除后可遍历文件中所有PID
  2. 用status/*替代ls status:避免文件名包含空格、特殊字符时出现解析错误,提升脚本健壮性
  3. 增加进程映射操作调用:在进程确认终止后,执行自定义的process_mapping函数(需替换为你的实际业务逻辑)
  4. 添加sleep间隔:避免无限循环持续占用CPU资源,可根据实际需求调整间隔时长
  5. 使用read -r读取PID:避免读取含反斜杠的内容时出现转义异常,提升兼容性
  6. 可选的PID清理逻辑:取消注释sed行可从文件中删除已完成的PID,避免重复检查同一进程

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 02:25:16