在工作中,我们有一台超级计算机可以通过SSH访问。
我们登录,使用带有参数的bsub命令保留核心,后者创建(从doc)“与伪终端交互的bash会话”。
在这个“伪终端”中,我们转到一个文件夹,用参数启动求解器,然后让它运行到完成。
所以应用程序完成了,会话保持开放,保留的核心保持保留,然后几天后(如果sim在工作结束后周五完成),IT在周一发送一封电子邮件,声明内核是保留的,但是他们没有看到任何活动,等等。
我已经检查了https://stackoverflow.com/questions/14254118/waiting-for-background-processes-to-finish-before-exiting-script和巴什--如何在前面的命令完成后运行命令?以及其他论坛/教程,但我发现的只是如何在关闭终端后保持应用程序的运行(将应用程序与终端分离)。
我需要相反的,我想关闭终端(这可能是解算器的最后一步,这样它就可以退出终端并被杀死)。
我愿意接受建议,我可以在脚本中这样做,或者我可以让这个家伙在他的C++解决程序中编写代码。
我尝试了以下方法(在运行在VM中的Ubuntu上,希望它在任何bash环境中都能或多或少地工作,如果我错了,请纠正我):
delay_test.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语句不在那里一样)。我的最佳猜测是,应用程序必须返回才能退出终端,但这只是猜测而已。
我还尝试了一种脚本方式:
test.sh:
#!/bin/bash
./delay_test &
wait
exit在这种情况下,我的理解告诉我,exit语句将完成脚本,但是,一旦该应用程序终止,我需要退出终端会话。
那么,在应用程序退出之后,我能做些什么来迫使“伪终端”退出呢?
发布于 2016-10-28 17:40:08
bsub命令提供的shell中最简单的方法是在要使用exec运行的任何命令前加上前缀,这是一个内置的shell,它将用您的解决程序替换提供的shell:
exec yoursolver当yoursolver退出时,它将返回到bsub,因为该外壳早已被求解程序所取代。
(顺便说一句,有些语言( TCL,PHP)的exec与shell或Perl exec或C exec(3)函数完全不同,所以如果您正在使用或熟悉这些语言,请注意这种差异;TCL和PHP版本更类似于C system(3)或Perl system函数,或者将命令键入shell,因为最初的进程还在后面。)
https://unix.stackexchange.com/questions/319586
复制相似问题