在工作中,我們有一台可透過 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,因為之後原始進程仍然存在。