srun交互式会话Lua脚本设置bash --login不生效问题求助
问题:Slurm Lua脚本无法将bash替换为bash --login生效
我尝试在cli_filter/lua中编写Lua脚本,目的是让bash的所有交互式会话都被当作登录会话(会读取/etc/profile及/etc/profile.d/*.sh),但把"bash"替换为"bash --login"的设置始终不生效。
我的Lua脚本
function slurm_cli_pre_submit(options, pack_offset) if options["type"] == "srun" then if options["pty"] ~= nil then if options.argv[1] == "bash" then options.argv[1] = 'bash --login' print(options.argv[1]) print("slurm_cli_pre_submit: Forcing interactive non-login session as a login shell with -l") end end end return slurm.SUCCESS end function slurm_cli_setup_defaults(options, early_pass) return slurm.SUCCESS end function slurm_cli_post_submit(offset, job_id, step_id) return slurm.SUCCESS end
执行输出
-bash-4.2$ srun -w node5 --pty bash bash slurm_cli_pre_submit: Forcing interactive non-login session as a login shell with -l bash-4.4$
问题原因及解决办法
问题出在options.argv[1] = 'bash --login'这行代码:argv是按命令参数拆分的数组,直接把第一个元素改成带空格的字符串后,Slurm会把整个"bash --login"当作一个单独的命令去查找执行,而不是将--login识别为bash的参数,所以实际启动的还是普通bash会话。
正确的做法是拆分参数,将--login作为单独的元素插入到argv数组中:
function slurm_cli_pre_submit(options, pack_offset) if options["type"] == "srun" then if options["pty"] ~= nil then if options.argv[1] == "bash" then -- 拆分参数,确保--login被识别为bash的选项 options.argv[1] = "bash" table.insert(options.argv, 2, "--login") print(table.concat(options.argv, " ")) print("slurm_cli_pre_submit: 强制将交互式非登录会话转为登录shell") end end end return slurm.SUCCESS end function slurm_cli_setup_defaults(options, early_pass) return slurm.SUCCESS end function slurm_cli_post_submit(offset, job_id, step_id) return slurm.SUCCESS end
修改后,argv数组会变为["bash", "--login", ...],Slurm会正确传递参数给bash,启动登录shell,此时bash会自动读取/etc/profile及/etc/profile.d/*.sh中的配置。
内容的提问来源于stack exchange,提问作者Roshni K.P.
相关产品推荐
相关产品推荐

