如何在单个srun命令下依次执行多程序?无需单独脚本可行吗?
在单个srun命令中依次执行多个命令的方法
当然可以在单个srun命令下完成多个命令的依次执行,完全不需要单独写脚本文件。先纠正你之前的错误写法,再给出正确方案:
你原来的写法有问题
你写的:
srun python ./python_code1.py & python ./python_code2.py
这个命令的实际效果是:把srun python ./python_code1.py放到本地shell后台执行,然后立刻在本地shell中运行python ./python_code2.py——第二个命令根本不会在srun分配的集群节点上执行,完全不是你想要的效果。
正确的单命令实现方式
你可以让srun调用一个shell实例,把需要依次执行的命令通过bash -c(或者sh -c)传递进去,用分号;或者逻辑与&&分隔多个命令:
方式1:不管前序命令是否成功都执行后续命令
用分号分隔,适合不管第一个脚本成功与否都要跑第二个的场景:
srun bash -c "python ./python_code1.py; python ./python_code2.py"
方式2:仅当前序命令执行成功时才执行后续命令
用&&分隔,适合必须第一个脚本正常跑完才跑第二个的场景:
srun bash -c "python ./python_code1.py && python ./python_code2.py"
注意事项
如果你的命令里包含引号、空格等特殊字符,需要注意转义逻辑。比如某个python脚本需要带含空格的参数,可以用单引号包裹整个命令字符串,内部用双引号:
srun bash -c 'python ./python_code1.py --input "data file.txt"; python ./python_code2.py'
这样能避免shell解析出错。
这种写法本质上和你写launch.sh脚本再用srun launch.sh调用的效果完全一致,只是把脚本内容直接内嵌到了命令行里,省去了单独创建文件的步骤。
内容的提问来源于stack exchange,提问作者Liam F-A
相关产品推荐
相关产品推荐

