從在該終端機中啟動的應用程式關閉該終端

從在該終端機中啟動的應用程式關閉該終端

在工作中,我們有一台可透過 SSH 存取的超級電腦。

我們登錄,使用帶參數的命令保留核心bsub,後者創建(來自文件)“帶有偽終端的交互式 bash 會話”。

然後,在該“偽終端”中,我們轉到一個資料夾,使用參數啟動求解器並讓它運行直至完成。

因此,應用程式完成並且會話保持開啟狀態,並且保留的核心保持保留,然後幾天后(如果sim 週五下班後完成)IT 會在周一發送一封電子郵件,說明核心已保留,但他們沒有看到任何活動, 等等等等等等...

我查過https://stackoverflow.com/questions/14254118/waiting-for-background-processes-to-finish-before-exiting-scriptBash - 如何在上一個指令完成後執行指令?和其他論壇/教程,但我發現的只是如何在關閉終端(從終端分離應用程式)後保持應用程式運行。

我需要相反的,我想關閉終端(這可能是解算器的最後一步,因此它可以退出終端並被殺死)

我願意接受建議,我可以在腳本中完成,或者我可以讓那個人在他的 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,因為之後原始進程仍然存在。

相關內容