사용자 입력으로 스크립트를 실행한 다음 작업 연결을 끊고 백그라운드에서 실행합니다.

사용자 입력으로 스크립트를 실행한 다음 작업 연결을 끊고 백그라운드에서 실행합니다.

그래서 먼저 사용자에게 일련의 세 가지 변수를 요청하는 bash 스크립트가 있습니다. 그런 다음 랩탑과 슈퍼컴퓨터 사이의 연결을 끊더라도 스크립트가 계속 실행되도록 세션 연결이 끊긴 백그라운드에서 스크립트가 실행되기를 원합니다.

echo를 사용하려면 변수가 필요합니다. 코드는 다음과 같습니다.

echo "What is limit for low level optimization?" #ask for low limit
read low
echo "What is limit for high level optimization?" #ask for high limit
read high
echo "What method?" #ask for method
read input 

그런 다음 긴 명령 목록을 실행합니다.

하지만 내 세션에서 이 작업의 연결을 성공적으로 끊는 방법을 모르겠습니다. 로그아웃 후 단계에서 생성된 파일이 생성되지 않았기 때문에 마지막 "disown" 명령이 작동하지 않았습니다.

내가 이해한 바에 따르면 nohup은 여기서 작동하지 않습니다. 왜냐하면 스크립트가 처음에 제공하도록 요청하는 입력을 읽지 못하게 하기 때문입니다.

그럼 설정하는 방법은 없을까요?

답변1

nohup스크립트의 두 번째 부분에서 작업을 시뮬레이션하여 이를 수행 할 수 있습니다 .

nohup명령은 다음 작업만 수행합니다.

  • 스크립트가 터미널에서 읽거나 터미널에 쓰려고 시도하지 않도록 표준 파일 설명자를 리디렉션합니다.

  • SIGHUP 신호를 포착하고 무시하십시오. SIGHUP은 제어 터미널이 닫힐 때 프로세스가 수신하는 신호입니다. 생략하면 터미널이 닫힌 후에도 프로세스가 계속 실행됩니다.

이 작업을 수행하려면 다음 스크립트를 사용할 수 있습니다.

echo "What is limit for low level optimization?" #ask for low limit
read low
echo "What is limit for high level optimization?" #ask for high limit
read high
echo "What method?" #ask for method
read input 
(
    trap '' 1  # Ignore SIGHUP
    # Series of long running commands
    # using $low, $high and $input
) </dev/null >myscript.log 2>&1 &

마지막 줄은 /dev/null의 stdin과 stdout 및 stderr을 a로 리디렉션합니다. myscript.log(더 나은 파일 이름을 선택하고 타임스탬프나 유사한 파일 이름을 사용하여 고유하게 만들 수도 있습니다.)

마지막으로 전체 프로세스를 백그라운드에 두고 최종 &.

또 다른 가능성은 스크립트를 두 부분으로 분할하고 두 번째 부분에서 low및 명령줄 인수로 또는 내보낸 환경 변수로 사용하도록 하는 것입니다 high.input실제 nohup주문하다. 대화형 프롬프트를 처리하지 않고도 실행의 두 번째 부분을 스크립팅할 수 있으므로 이는 더 간단하고 유연해야 합니다.

tmux또 다른 가능성은 연결이 끊어졌을 때 세션에 다시 연결할 수 있도록 또는 같은 터미널 멀티플렉서를 사용하거나 screen(또는 직접 분리할 수 있음) 스크립트가 계속 실행되는 동안 새 창을 열 수 있는 것입니다. 새 셸 초기 창을 실행합니다. 위 솔루션 중 하나를 구현하는지 여부에 관계없이 tmux또는 를 채택하는 것이 좋으 screen므로 가능하다면 시도해 보십시오.

답변2

긴 명령 목록을 중괄호로 묶은 다음 &를 사용하면 기다리지 않고 계속할 수 있습니다.

echo "Read input"
{
    # all your commands in curly braces
    # ...
} & exit 0

그러면 모든 명령이 완료될 때까지 기다리지 않고 종료할 수 있습니다. 서버 연결이 끊어지더라도 계속 실행되어야 합니다.

관련 정보