Singularity实例中执行R控制台,按Ctrl-C触发退出码130的问题
问题解决:Singularity实例模式下R控制台Ctrl-C崩溃的问题
核心原因
退出码130对应进程收到SIGINT信号(Ctrl-C)后直接终止。直接用singularity exec运行R时,R进程与终端直接绑定,信号由R自身捕获处理;但通过instance模式连接时,后台实例的守护进程改变了信号传递路径,导致Ctrl-C直接终止R进程,而非被R的内部机制拦截。
可行解决方案
强制分配伪终端(最直接有效)
在连接实例启动R时添加--pty参数,模拟直接运行时的终端环境,修复信号传递逻辑:singularity exec --pty instance://my_instance R也可先进入实例的交互式shell再启动R,终端环境更接近直接运行场景:
singularity shell --pty instance://my_instance # 进入shell后直接输入R启动会话升级Singularity版本
部分旧版Singularity(低于3.8版本)在instance模式下存在信号传递bug,执行singularity --version查看当前版本,联系HPC管理员升级到较新版本可解决该问题。手动设置R信号处理(临时 workaround)
启动R后执行以下代码,手动捕获SIGINT信号,避免进程直接崩溃:signal(SIGINT, function() { message("Interrupt received, session continues...") return(invisible(NULL)) })
验证方法
启动R后执行一个耗时操作(比如for(i in 1:1000000) { print(i) }),按Ctrl-C中断,检查R会话是否保持正常。
内容的提问来源于stack exchange,提问作者bepoli
相关产品推荐
相关产品推荐

