我试图使用srun在后台运行slurm作业。不幸的是,由于我现在必须通过Docker运行事物,因此使用sbatch有点麻烦,因此我正在尝试找出是否可以完全避免使用它。
根据我的观察,每当我运行srun时,比如说:
srun docker image my_job_script.py
关闭我正在运行命令的窗口(以避免接收所有打印语句),打开另一个终端窗口以查看命令是否仍在运行,似乎我的运行脚本由于某种原因被取消了。由于它不是通过sbatch运行的,所以它不会向我发送带有错误日志的文件(据我所知),所以我不知道它为什么关闭。
我还尝试过:
srun docker image my_job_script.py &
我希望在终端中重新获得控制权。不幸的是,如果我这样做,它仍然会将东西打印到我的终端屏幕上,而我正试图避免这种情况。
基本上,我通过ssh登录到远程计算机,然后执行srun命令,但似乎如果我终止ssh连接的通信,则srun命令会自动停止运行。有没有办法阻止这种情况发生?
理想情况下,我想要发送脚本运行,除非我通过scancel取消它,否则不会因任何原因被取消,并且不应该打印到我的屏幕上。因此,我的理想解决方案是:
- 即使我退出ssh会话,也要继续运行srun脚本
- 即使我关闭发送命令的窗口,也要继续运行我的srun脚本
- 让我的srun脚本继续运行并让我离开srun会话,而不会打印到我的屏幕上(即实际上在后台运行)
这将是我理想的解决方案。
对于想了解sbatch问题的好奇人群,我想能够执行以下操作(这是理想的解决方案):
sbatch docker image my_job_script.py
然而,正如人们所知道的那样,它不起作用,因为sbatch接收到的命令是docker,它不是一个"batch"脚本。基本上,一个简单的解决方案(对于我的情况实际上并不起作用)是将docker命令包装在批处理脚本中:
#!/usr/bin/sh
docker image my_job_script.py
不幸的是,我实际上正在使用批处理脚本来编码大量信息(类似于配置文件)以运行任务。因此这样做可能会影响我的工作,因为它们的基础文件正在更改。通过直接将作业发送到sbatch来避免这种情况,因为它本质上创建了批处理脚本的副本(如在这个问题中所述:在slurm中运行时更改发送给sbatch的bash脚本是个坏主意吗?)。因此,解决我的问题的真正方法是使我的批处理脚本包含所有我的脚本需要的信息,然后以某种方式在Python中调用docker并同时传递所有信息。不幸的是,其中一些信息是函数指针和对象,因此我甚至不清楚如何将这样的东西传递给在Python中运行的docker命令。
或者,直接在sbatch中运行docker而不是使用批处理脚本也可以解决问题。
srun docker image my_job_script.py &
对您有效,除了输出之外,那么如何尝试:srun -o output.txt docker image my_job_script.py &
。您还可以使用 -e 重定向 _stderr_。 - Bub Espinja