磁盘空间低于设定阈值时能否在Bash中挂起/暂停运行进程
磁盘不足自动暂停进程的Bash实现方案
完全可以在Bash环境下实现这类磁盘空间预警+进程管控逻辑,这也是小型生信服务器场景下,避免跑了数天的分析流程因磁盘写满崩溃的常用实操方案,没有技术卡点。
核心实现基础
实现逻辑的核心分三步:定时采集目标存储分区的可用空间、和预设阈值做比对、触发对应的进程挂起/恢复操作,不需要依赖复杂的第三方工具。
第一步:磁盘空间采集
生信分析的存储盘通常是单独挂载的分区(比如/data),不需要监控系统根分区的空间,用df命令就能精准提取指定分区的可用空间数值,示例命令:
# 提取/data分区的可用空间,单位为GiB,输出整数数值 available_gb=$(df --output=avail -BG /data | tail -n1 | tr -dc '0-9')
第二步:阈值判断与进程管控
这里需要避开一个常见认知误区:不要不分场景直接挂起所有进程,正确的分层管控逻辑既能防磁盘爆仓,也不会误操作导致流程损坏:
- 先拦截新作业提交:低于阈值时直接阻断新的流程启动,避免新的大文件写入挤占剩余空间
- 再挂起正在运行的分析进程:对已经在写临时文件的进程发送
SIGSTOP暂停信号,进程的运行上下文、内存状态、已打开的文件句柄会完整保留,等磁盘空间充足时发送SIGCONT信号即可从暂停位置继续运行,不会丢失已完成的分析进度 - 同步触发告警:挂起进程的同时推送通知,提醒及时清理临时文件、过期的分析结果
可直接复用的监控脚本示例
#!/bin/bash # 自定义配置项 TARGET_MOUNT="/data" # 需要监控的生信数据盘挂载点 THRESHOLD_GB=100 # 预设的空间阈值 # 获取当前分区可用空间 avail_gb=$(df --output=avail -BG "$TARGET_MOUNT" | tail -n1 | tr -dc '0-9') # 空间低于阈值时触发操作 if [ "$avail_gb" -lt "$THRESHOLD_GB" ]; then # 匹配当前用户下的生信分析进程,发送STOP信号挂起 # 可根据自己常用的分析工具调整匹配的进程名,避免误挂系统进程 pkill -STOP -u $USER -f "(snakemake|nextflow|bwa|gatk|samtools|fastp)" # 发送告警提示 echo "提示:$TARGET_MOUNT 剩余空间仅${avail_gb}GB,已暂停相关分析进程,请及时清理空间" > /var/tmp/disk_alert.log fi
把这个脚本通过cron配置成每5分钟运行一次,就能实现持续监控:
# crontab -e 中添加以下行 */5 * * * * /path/to/your/disk_watch.sh
实操注意事项
- 一定要限定要挂起的进程范围,不要全量匹配所有进程,避免误挂SSH会话、监控脚本本身这类后台进程
- 磁盘清理完成后,执行对应命令即可恢复所有被挂起的分析进程:
pkill -CONT -u $USER -f "(snakemake|nextflow|bwa|gatk|samtools|fastp)" - 不要把阈值设得过低,生信单步分析动辄写入几十GB的临时文件,100GB的阈值刚好能留出足够的缓冲空间,避免进程触发挂起前就已经把磁盘写满
- 这类实现方案之所以相关公开资料较少,是因为有正式作业调度系统(Slurm、SGE)的服务器大多会在调度层配置磁盘配额监控,个人小实验室的无调度服务器场景下,这类脚本基本都是运维人员自己留存使用,很少公开分享
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

