后台进程完成状态校验及进程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
关键修改点说明
- 移除
break语句:原脚本的break导致内层循环仅读取文件首行就退出,移除后可遍历文件中所有PID - 用
status/*替代ls status:避免文件名包含空格、特殊字符时出现解析错误,提升脚本健壮性 - 增加进程映射操作调用:在进程确认终止后,执行自定义的
process_mapping函数(需替换为你的实际业务逻辑) - 添加
sleep间隔:避免无限循环持续占用CPU资源,可根据实际需求调整间隔时长 - 使用
read -r读取PID:避免读取含反斜杠的内容时出现转义异常,提升兼容性 - 可选的PID清理逻辑:取消注释
sed行可从文件中删除已完成的PID,避免重复检查同一进程
内容的提问来源于stack exchange,提问作者Rehana
相关产品推荐
相关产品推荐

