如何让长期运行的Slurm作业在文件更新时触发独立Slurm作业?
实现方案
完全可以通过Slurm实现这个需求,核心思路是在同一个Slurm作业中后台运行程序A,同时用文件系统监控工具触发程序B的Slurm作业提交。以下是具体步骤和脚本示例:
1. 编写主作业脚本(同时运行程序A和监控逻辑)
创建一个Slurm作业脚本run_A_with_monitor.sh,内容如下:
#!/bin/bash #SBATCH --job-name=A_monitor #SBATCH --nodes=1 #SBATCH --ntasks=1 #SBATCH --time=7-00:00:00 # 根据集群规则设置足够长的运行时长,或用--time=infinite(若集群允许) # 后台启动长期运行的程序A /path/to/your/program_A & A_PID=$! # 定义需要监控的目标文件 TARGET_FILE="/path/to/your/output/file.txt" # 循环监控文件修改事件,触发程序B的作业提交 while inotifywait -e modify "$TARGET_FILE"; do # 提交程序B的Slurm作业,替换为你的程序B提交脚本路径 sbatch /path/to/your/submit_B.sh done # 等待程序A进程结束(可选,若程序A会自然退出则保留) wait $A_PID
2. 编写程序B的Slurm提交脚本
创建submit_B.sh,用于单独提交程序B的作业:
#!/bin/bash #SBATCH --job-name=program_B #SBATCH --nodes=1 #SBATCH --ntasks=1 #SBATCH --time=01:00:00 # 根据程序B的实际运行时长调整 # 执行程序B /path/to/your/program_B
关键注意事项
- 依赖检查:确保集群节点安装了
inotify-tools(包含inotifywait工具),若未安装可联系集群管理员部署,或自行编译安装到个人目录。 - 避免重复触发:如果程序A的单次写入会触发多次
modify事件,可在监控循环中添加延迟(如sleep 2)或记录上次提交时间,防止短时间内重复提交程序B的作业。 - 作业时长设置:程序A为长期运行,需确保主作业的
--time参数足够覆盖其运行周期;若集群不允许无限时长,可添加逻辑在程序A未退出时自动重新提交主作业。 - 资源分配:主作业的资源配置需同时满足程序A和监控脚本的需求,避免资源耗尽导致程序异常。
内容的提问来源于stack exchange,提问作者Lim Jing
相关产品推荐
相关产品推荐

