我必须启动总共 NUMTOT 个程序(可以是任何 C、Mathematica、ns-2...数学环境)。问题是运行这些进程的计算机只允许最大执行次数,例如MAX,(MAX < NUMTOT)。
我在终端中使用以下行运行这些程序
./run.sh -d directory num
重复地,其中 run.sh 是我调用数学程序的脚本; directory是我的程序所在的目录,num表示新执行的次数(integer*num = NUM)。脚本“run.sh”使用“directory”(程序)的副本创建“num”个目录,并启动“num”个程序实例。就我而言,是 Matlab 实例。
我想要一个脚本,它可以自动跟踪正在运行的进程数,以及当最大数量减少到(MAX-num)时,因为“num”已经完成,然后启动Matlab的下一个“num”模拟,直到总数NUM 次模拟已完成。
如果脚本能够在只有一个程序刚刚完成时调用下一个程序来维护 MAX 个可能的进程,那就更好了。
实际上,要了解正在运行的进程数,我运行以下脚本
ps axu |grep plopez|grep simulacion|grep MATLAB|awk '{ $2} END{print NR}'
这给出了此时运行的 Matlab 总数。
如何仅通过一个脚本进行整套模拟?
答案1
强制用户执行最大进程数的常用方法是通过pam_limits(8)
.检查limits.conf(5)
联机帮助页以获取详细信息和示例以进行/etc/security/limits.conf
相应的更改。
具体来说,您要配置的nproc
参数:
nproc
maximum number of processes
联机帮助页中使用此参数的示例:
@faculty soft nproc 20
@faculty hard nproc 50
答案2
我建议不要定期检查正在运行的实例的数量,而是建议编写一个脚本,一次又一次地运行该程序,直到NUM
达到该数量,并MAX
并行启动该脚本多次。
您还可以捕获SIGCHLD
子进程退出时发出的信号。必须首先使用 启用此功能set -o monitor
。更详细的示例和替代方案可以在以下位置找到Stackoverflow 上的一个线程。
答案3
如果您的 MATLAB 作业是非交互式的(即运行批处理脚本),那么您可能需要研究批处理调度软件,例如扭矩或者泥浆- 这种资源管理正是他们设计的目的。
这些通常用于 HPC 集群,但在您的情况下,您的集群只有一个计算节点。
Slurm 的优点是它是一个现代化的、设计良好的系统,利用了多年来与其他调度程序的经验。 Torque/PBS 的优点是熟悉——很多人已经在其他集群上使用过它。 Slurm 有一组兼容性包装器,以便习惯 PBS 或 Torque 的人们可以通过熟悉的命令立即开始使用它。
两者都会为您提供多种控制作业调度的选项 - 通过 CPU 核心、内存、可用许可证等。如果您需要跟踪或限制每个用户的累计使用量,它们还会提供记账功能。例如,Slurm 有一个公平使用加权选项,可用于优先考虑最近没有运行过很多作业的人,而不是经常使用系统的人 - 这通常比固定的总 CPU 时间硬配额更好。
绕过有限许可证的另一个选择是编写 MATLAB 脚本,以便它们与GNU 倍频程以及 MATLAB。然后,您可以根据需要运行任意多次测试/开发运行,并在 MATLAB 中进行最终运行(如果需要发布结果或与其他研究人员合作)。 Octave 大部分与 MATLAB 兼容,但也有一些差异 - 这是概括。
答案4
一个在另一个线程中回答有关限制 bash 中子进程数量的问题显示以下代码片段,它将等待 4 个作业之一完成,每十秒检查一次。
while [ $(jobs | wc -l) -ge 4 ] ; do sleep 10 ; done
请记住,这种积极的睡眠策略相当低效、粗糙且不精确。