장기 실행 작업에 사용하려는 머신에 SSH를 통해 원격으로 액세스할 수 있습니다. 지금까지 내가 한 일은
ssh user@remote command-to-run
여기에는 몇 가지 단점이 있습니다.
- 단순히 로컬 컴퓨터를 일시 중지할 수는 없습니다. 그렇게 하면 해당
SIGHUP
컴퓨터가 원격 프로세스로 전송되어 효과적으로 종료됩니다. 이를 방지하기 위해 nohup을 사용할 수 있습니다. - 출력이 상당히 길 수 있으므로 파일로 리디렉션하는 것이 좋습니다. 물론 수동으로 할 수도 있지만 일련의 명령을 사용하면 다루기가 어려워질 것입니다.
- 이 프로세스를 실행하는 데 시간이 오래 걸릴 수 있습니다. 이상적으로는 제출자는 단순히 명령(스크립트)이 성공적으로 제출되었음을 확인하고 종료합니다.
- 프로세스가 종료되면 종료 코드와 함께 메일 알림을 받고 싶습니다. 물론 쉘 스크립트와 터미널 명령을 사용하여 수동으로 보낼 수도 있는데, 이는 또 다른 트릭입니다.
- 동시에 여러 스크립트를 안전하게 예약할 수 있기를 원합니다. 특히 수동으로 이름을 바꾸지 않고도 동일한 이름을 가진 여러 스크립트를 푸시할 수 있기를 원합니다. 파일 시스템에 이미 있는 파일에 대해 걱정하고 싶지 않습니다.
이는 SLURM의 기능과 매우 유사하지만 원격 측에 대한 관리 권한이 없습니다. 게다가 원격 시스템의 모든 코어에 액세스할 수 있을 때 필요한 코어 수를 선언하는 것은 의미가 없습니다.
제가 사용할 수 있는 것이 있나요? 제가 설명한 내용은 일반적인 사용 사례인 것 같습니다.
답변1
이러한 장기 실행 작업을 실행할 스크립트를 원격 시스템에 넣을 수 있다면 정말 쉬울 것입니다.
#!/bin/bash
# This script will run a long-running-job (if it's not already running)
# and email when it completes.
lockfile=/var/run/long-job-1.lock
logfile=$(mktemp)
errfile=$(mktemp)
if [[ -f "$lockfile" ]]; then
echo "This job is already running." 1>&2
exit 1
else
echo $$ > "$lockfile"
trap 'rm -f "$lockfile" "$logfile" "$errfile"' EXIT
fi
/path/to/some/really/longrunning/job.sh
returncode=$?
if [[ 0 -ne "$returncode" ]]; then
cat "$errfile" | mailx -s "Job failed with exit code $returncode" -a "$logfile" [email protected]
else
cat "$logfile" | mailx -s "Job succeeded" [email protected]
fi
이 스크립트를 원격 서버의 홈 디렉토리에 longjob1.sh
. 로컬로 배치하면 다음을 수행할 수 있습니다.
ssh username@remotehost "screen -dmS LongJob1 ./longjob1.sh"
스크립트(및 호출되는 작업)는 screen
원격 서버의 세션에서 실행되며 완료되면 이메일을 보내드립니다. 오류로 인해 종료되면 표준 로그와 함께 이메일을 통해 오류 로그를 받게 됩니다.