직장에는 SSH를 통해 액세스할 수 있는 슈퍼컴퓨터가 있습니다.
bsub
우리는 "의사 터미널을 사용하는 대화형 bash 세션"(문서에서)을 생성하는 예약 core 인수와 함께 명령을 사용하여 로그인합니다 .
그런 다음 해당 "의사 터미널"에서 폴더로 이동하여 매개변수로 솔버를 시작하고 완료될 때까지 실행되도록 합니다.
따라서 애플리케이션이 완료되고 세션은 열린 상태로 유지되며 예약된 코어는 열린 상태로 유지됩니다. 그런 다음 며칠 후(금요일 퇴근 후 시뮬레이션이 완료된 경우) 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
이를 수행하는 가장 간단한 방법 은 제공된 셸을 솔버로 대체할 내장 셸을 bsub
실행하려는 명령 앞에 붙이는 것입니다 .exec
exec yoursolver
종료 시 셸이 오랫동안 솔버로 대체되었기 때문에 yoursolver
로 돌아갑니다 .bsub
(그런데 일부 언어(TCL, PHP) exec
에는 전혀 좋아하지 않는다쉘 또는 Perl exec
또는 C exec(3)
함수. 따라서 해당 언어를 사용하고 있거나 익숙하다면 이 차이점을 인식하십시오. TCL 및 PHP 버전은 원래 프로세스 이후 C system(3)
또는 Perl system
함수 또는 쉘에 명령을 입력하는 것과 더 유사합니다. 그 후에도 여전히 존재합니다. )