해당 터미널에서 시작된 앱에서 터미널 닫기

해당 터미널에서 시작된 앱에서 터미널 닫기

직장에는 SSH를 통해 액세스할 수 있는 슈퍼컴퓨터가 있습니다.

우리는 로그인하고 매개변수가 있는 명령을 사용하여 코어를 예약하고 bsub후자는 (문서에서) "의사 터미널이 있는 대화형 bash 세션"을 생성합니다.

그런 다음 해당 "의사 터미널"에서 폴더로 이동하여 매개변수로 솔버를 시작한 다음 실행이 완료되도록 합니다.

따라서 앱이 완료되고 세션은 열린 상태로 유지되며 예약된 코어는 예약된 상태로 유지됩니다. 그런 다음 며칠 후(심이 퇴근 후 금요일에 완료된 경우) IT는 월요일에 코어가 예약되었음을 알리는 이메일을 보냈지만 활동이 표시되지 않았습니다. , ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ...

나는 확인했다https://stackoverflow.com/questions/14254118/waiting-for-Background-processes-to-finish-before-exiting-script그리고Bash - 이전 작업이 완료된 후 명령을 실행하는 방법은 무엇입니까?및 기타 포럼/자습서에서 찾아볼 수 있지만 터미널을 닫은 후에도 애플리케이션을 계속 실행하는 방법(터미널에서 애플리케이션을 분리하는 방법)만 찾았습니다.

반대가 필요합니다. 터미널을 닫고 싶습니다. (이것은 솔버의 마지막 단계일 수 있으므로 터미널을 종료하고 종료될 수 있습니다.)

나는 제안을 받아들일 수 있습니다. 스크립트로 할 수도 있고, C++ 솔버로 코드를 작성하도록 할 수도 있습니다.

나는 다음을 시도했습니다 (VM에서 실행되는 Ubuntu Server에서 이것은 모든 환경에서 거의 동일하게 작동할 것으로 예상합니다 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

명령 이 제공하는 셸에서 가장 간단한 방법은 bsub실행할 명령 앞에 를 붙이는 것입니다 exec. 이는 제공된 셸을 솔버로 대체하는 내장 셸입니다.

exec yoursolver

종료 되면 셸이 솔버로 교체된 지 오래되었으므로 yoursolver로 돌아갑니다 .bsub

(여담으로, 일부 언어(TCL, PHP) exec에는 전혀 좋아하지 않아쉘, Perl exec또는 C exec(3)함수. 이러한 언어를 사용하고 있거나 익숙하다면 이 차이점에 유의하세요. TCL 및 PHP 버전은 C system(3)또는 Perl system함수와 더 유사하거나 원래 프로세스가 이후에도 여전히 존재한다는 점에서 셸에 명령을 입력하는 것과 더 유사합니다.)

관련 정보