여러 병렬 화면 스레드를 자동으로 시작하시겠습니까?

여러 병렬 화면 스레드를 자동으로 시작하시겠습니까?

우리 학교 HPC에는 스케줄러가 없습니다. 따라서 작업 대기열보다 더 좋은 것은 없습니다. 따라서 qsub병렬 작업 제출을 통과하거나 자동화 할 수 없습니다 sbatch.

작업을 "제출"하는 데 항상 사용한 방법은 screen: 을 입력 screen하고 를 누른 Enter다음 를 입력 ./runMyJob.sh하고 CTRL+를 a누른 다음 d분리하는 것입니다.

이제 여러 병렬 화면 세션을 시작한 다음 각 세션에서 작업을 실행하고 마지막으로 모든 화면 세션을 분리하는 프로세스를 자동화/스크립팅하고 싶습니다.

보시다시피 수동 조작 중에 EnterCTRL+를 누른 a다음 을 눌렀습니다 d. 이러한 키 입력을 어떻게 스크립팅합니까?

추신: 스케줄러 없이 HPC에서 병렬 작업 제출을 구현하는 데 도움이 되는 제안을 환영합니다!

답변1

키 입력이라고 생각하지 말고 작업을 완료하는 것으로 생각하세요. 키 입력은 상호 작용의 한 형태입니다. 작업을 자동화하는 방법은 스크립트를 작성하는 것입니다.

화면에서 작업을 시작하고 즉시 분리하려면 다음을 실행하세요.

screen -md ./runMyJob.sh

작업을 더 쉽게 찾으려면 -S세션 이름을 설정하는 옵션이 있습니다.

예를 들어 작업 실행 파일의 이름을 세션 이름으로 사용하는 다음 스크립트를 작성할 수 있습니다.

#!/bin/sh
screen -md -S "${1##*/}" "$@"

와 같은 이름을 submit지정하고 PATH(단일 사용자 바이너리 설치 위치는 무엇입니까?그리고어떤 Unix 명령으로 발견된 홈 디렉터리 경로를 추가하는 방법은 무엇입니까?도움이 될 수 있습니다) 실행 가능하게 만드세요( chmod +x ~/bin/submit). 작업을 시작하려면 다음을 실행하세요.

submit ./runMyJob.sh

병렬 실행의 경우 조사할 수 있습니다.GNU 병렬.

작업 제출 프레임워크는 작업을 시작하는 것 이상의 기능을 수행합니다. 또한 사용 가능한 CPU 시간과 메모리가 있는 곳에서 실행되도록 예약하고 제출자에게 로그를 보냅니다. 관리자에게 작업 제출을 위한 적절한 프레임워크를 설정하도록 요청해야 합니다.

답변2

Enter, Ctrl- 일반 ASCII 코드를 a생성합니다 d.

pipe()따라서 가능한 해결책은 명명되지 않은 파이프( )를 사용하여 프로그램을 만든 다음 fork()먼저 파이프의 읽기 끝을 표준 입력에 바인딩하는 하위 프로세스를 만든 다음 screen하위 프로세스( execve()또는 유사한)에서 실행되는 것입니다. 프로그램이 이미 시작된 경우 생성된 파이프의 쓰기 끝 부분에 프로세스를 시작하는 데 필요한 명령줄을 작성할 수 있습니다.

작업을 프로그램에 넣는 방법은 또 다른 주제입니다. 예를 들어, 작은 스케줄러를 직접 작성할 수 있습니다(작업 대기열 및 N 프로세스를 병렬로 시작하는 일부 코드 등).

==편집==

Linux(또는 UN*X도 일부)의 경우 프로그램은 다음과 같습니다.

#include <sys/types.h>
#include <sys/linux.h>
#include <unistd.h>

int main(void) {
    int fds[2] = {0};
    pid_t pid = 0;

    pipe(fds);               /* Creates an unnamed pipe */
    pid = fork();            /* Forks a new process */
    if (pid == 0) {
        static char const *argv[] = {"/usr/bin/screen", NULL};
                             /* Note: The array might need to be changed,
                              *       depending on your requirements
                              *       (eg. command-line arguments)
                              */
        dup2(fds[0], stdin); /* Binds the read end of the pipe to stdin */
        execve(argv[0], argv, NULL);
        /* If you reach this point, your execve() failed */
    }
    sleep(1);                /* Waits for the child process to execute
                              * screen */
    char const data[] = "./MyJob.sh\n\x00d";
                             /* Note: You must replace the '\x00' by the
                              *       ASCII code of C-a!
                              */
    write(fds[1], data, sizeof(data));
                             /* Writes the name of the job along with the
                              * control codes to the child process
                              */
    int retcode = 0;
    waitpid(pid, &retcode, 0);
                             /* Waits for the child process to terminate */
                             /* Note: WEXITSTATUS(retcode) gets the exit
                              *       status of the child process */
    return 0;
}

이 프로그램은 아이디어를 설명해야 하지만 필요한 오류 처리가 부족합니다.

관련 정보