如何在不修改loadenv.sh时向Apptainer启动的新Shell传入任务?
解决方案
可以通过给loadenv.sh传递命令参数的方式,让新启动的Shell直接执行你的任务,无需修改loadenv.sh本身,具体调整runjob.sh即可:
方法一:利用Shell的-c参数传递命令
修改runjob.sh内容为:
./loadenv.sh -c 'python3 job.py'
原理:loadenv.sh最后执行$NEW_SHELL "$@",会把接收到的所有参数原封不动传给新启动的Shell。绝大多数Shell(比如bash、sh)都支持-c选项,该选项会让Shell执行后面引号内的命令字符串,而非启动交互式Shell。这样新Shell启动后会直接运行python3 job.py,执行完成后自动退出,正好满足需求。
方法二:通过标准输入传递命令(备选)
如果$NEW_SHELL支持从标准输入读取命令执行,也可以这样修改runjob.sh:
echo 'python3 job.py' | ./loadenv.sh
这种方式是把要执行的命令通过管道传给loadenv.sh,新启动的Shell会从标准输入读取并执行该命令。不过相比方法一,这种方式在部分Shell或环境下可能存在兼容性问题,优先推荐方法一。
内容的提问来源于stack exchange,提问作者Arland
相关产品推荐
相关产品推荐

