在工作中,我们有一台可通过 SSH 访问的超级计算机。
我们登录,使用带参数的命令保留核心bsub
,后者创建(来自文档)“带有伪终端的交互式 bash 会话”。
然后,在该“伪终端”中,我们转到一个文件夹,使用参数启动求解器并让它运行直至完成。
因此,应用程序完成并且会话保持打开状态,并且保留的核心保持保留,然后几天后(如果 sim 周五下班后完成)IT 会在周一发送一封电子邮件,说明核心已保留,但他们没有看到任何活动, 等等等等等等...
我查过https://stackoverflow.com/questions/14254118/waiting-for-background-processes-to-finish-before-exiting-script和Bash - 如何在上一个命令完成后运行命令?和其他论坛/教程,但我发现的只是如何在关闭终端(从终端分离应用程序)后保持应用程序运行。
我需要相反的,我想关闭终端(这可能是解算器的最后一步,因此它可以退出终端并被杀死)
我愿意接受建议,我可以在脚本中完成,或者我可以让那个人在他的 C++ 求解器中对其进行编码。
我尝试了以下操作(在虚拟机中运行的 Ubuntu 服务器上,期望这在任何环境中都或多或少地工作bash
,如果我错了,请纠正我):
延迟测试.c:
#include <stdio.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
printf("Doing some fake lengthy operation...");
sleep(15); // sleep for 15 seconds
return 0;
}
按预期编译并运行。我在返回之前尝试了system("clear");
(部分stdlib.h
),这也有效,我收到消息,然后 15 秒后屏幕被清除并且应用程序退出。
然后我尝试了system("exit");
,但没有任何反应(我的意思是应用程序退出,就好像该exit
声明不存在一样......)。我最好的猜测是应用程序必须先返回才能退出终端,但这只是一种猜测。
我还尝试了脚本方式:
测试.sh:
#!/bin/bash
./delay_test &
wait
exit
在这种情况下,我的理解告诉我该exit
语句是完成脚本,但一旦相关应用程序终止,我需要退出终端会话。
那么如何在应用程序退出后强制“伪终端”退出呢?
答案1
该命令提供的 shell 中最直接的方法bsub
是在要运行的任何命令前添加前缀exec
,这是一个内置 shell,它将用您的求解器替换提供的 shell:
exec yoursolver
退出时yoursolver
,将返回到bsub
,因为外壳早已被求解器取代。
(顺便说一句,请注意某些语言(TCL、PHP)有exec
一个 一点也不喜欢shell 或 Perlexec
或 Cexec(3)
函数,因此如果您正在使用或熟悉这些语言,请注意这种差异; TCL 和 PHP 版本更类似于 Csystem(3)
或 Perlsystem
函数,或者将命令键入 shell,因为之后原始进程仍然存在。)