내 순차 bash 스크립트가 비순차적 동작을 보여줍니다.

내 순차 bash 스크립트가 비순차적 동작을 보여줍니다.

내 bash 스크립트에 문제가 있으며 이를 해결하는 데 도움을 주시면 감사하겠습니다. 배쉬 스크립트script.sh다음과 같이:

#!/bin/bash
./command1 -i inFile.txt -o outFile1.bin > log1.txt
./command2 -i inFile.txt -o outFile2.txt > log2.txt
./command3 -i outFile2.txt -o outFile3.txt > log3.txt
...

여기서 -i는 입력 파일을 정의하고 -o는 출력 파일을 정의합니다. 명령 2의 출력 파일이 명령 3의 입력 파일로 사용되는 등 일부 종속성이 있습니다.

나는 다음을 사용하여 스크립트를 호출합니다.

nohup ./Script.sh > scriptLog.txt 2> scriptErr.txt &

이상한 일이 일어나고 있습니다. 스크립트가 오류 없이 완료될 때까지 실행됩니다(scriptErr.txt가 비어 있음). 출력 파일(outFile1.txt, outFile2.txt 및 outFile3.txt)이 생성되었으며 내가 아는 한 정확합니다. 이것일하다이 명령은 실행이 완료(Done)되었음을 표시합니다. 주문하다

ps aux | grep ./Script.sh

아무것도 반환하지 않습니다(grep 자체만 반환). 그러나 명령은

ps aux | grep ./command1

command1이 여전히 실행 중임을 표시합니다(command2 및 command3의 경우에는 해당되지 않음). 이것이 나를 혼란스럽게 합니다:

스크립트는 연속적이어야 합니다. 명령 2와 3은 완료되었지만 명령 1은 완료되지 않은 것이 어떻게 가능합니까?

명령 1이 완료되지 않으면 어떻게 출력 파일을 올바르게 생성할 수 있습니까?

매우 감사합니다!

답변1

여기서 문제는 nohup+ 에서 발생합니다 &.

이를 사용하여 프로세스를 백그라운드로 보낼 수 있습니다. &또한 현재 프로세스를 분기하십시오. 따라서 Script.sh두 번(또는 사용한 횟수의 두 배 &)을 얻지 못합니다. 새 Script.sh프로세스는 시작한 프로세스의 하위 프로세스입니다. commandX그것은 분기로 시작되었습니다 Script.sh.

기본 스크립트 프로세스가 완료되면 상위 프로세스가 Script.sh사라지고 모든 하위 프로세스가 init 프로세스로 이동됩니다. 이는 서로 다른 프로세스이며 이름만 일치하므로 약간의 혼란이 발생할 수 있습니다.

답변2

반환에도 불구하고 계속 실행되는 스크립트를 작성하는 것은 쉽습니다.

$ ./still_running 
I'm done
$ ps aux | grep '[s]till_running'
anthony  25666  0.0  0.0   7420  2092 pts/31   S    16:43   0:00 /bin/bash ./still_running

스크립트는 매우 간단합니다.

#!/bin/bash

(
    sleep 5m
    echo 'done now'
) &

echo "I'm done"

앰퍼샌드로 인해 백그라운드에서 실행되는 하위 쉘을 시작하고 상위 프로세스가 종료되더라도 계속 실행됩니다.

스크립트를 보지 않고(바람직하게는 최소한의 테스트 사례를 사용하여) 스크립트에서 무슨 일이 일어나고 있는지 판단하는 것은 불가능하지만 이와 유사한 시나리오는 가능합니다.

관련 정보