백그라운드 동기화 프로세스

백그라운드 동기화 프로세스

백그라운드에서 2개의 프로세스를 시작하고 싶지만 첫 번째 프로세스가 완료될 때까지 기다리려면 두 번째 프로세스가 필요합니다. 둘 다 매우 길기 때문에 터미널에서도 로그아웃할 수 있어야 합니다.

현재 나는 이것을 가지고 있습니다 :

 nohup ./script1.sh $arg1 &    
 wait
 nohup ./script1.sh $arg2 &

여기서 문제는 기다리는 동안 단말기를 사용할 수 없거나 로그아웃할 수 없다는 것입니다. 또한 '1 PID 명령을 캡처하고 기다리도록 입력했지만 문제가 지속됩니다.

요약하자면, script1과 script2를 호출하는 기본 스크립트를 시작하고 터미널을 닫았다가 5일 후에 열고 싶습니다. 이때 script1을 먼저 실행해야 하고, script2는 완료되어야만 실행을 시작할 수 있습니다.

답변1

기본 사상...

두 개의 스크립트를 순차적으로 실행하려면 그 사이에 세미콜론을 넣을 수 있습니다. script1 args ...; script2 args ...또는 스크립트 내에서 다음과 같이 두 줄에 넣을 수도 있습니다.

#!/bin/sh
script1 args ...
script2 args ...

백그라운드에서 실행하려는 경우에도 작동합니다. 서브쉘에 넣고 서브쉘을 백그라운드에 두기만 하면 됩니다. (script1 args ...; script2 args ...) &또는:

#!/bin/sh
(
  script1 args ...
  script2 args ...
) &

첫 번째 스크립트가 성공적으로 종료된 경우에만( code 사용) 두 번째 스크립트를 실행하려면 0세미콜론을 다음으로 바꾸면 됩니다 &&.script1 args ... && script2 args ...

...nohup 사용

하지만 nohup달리고 싶다하나명령과 하위 쉘은 개별 명령이 아니며 쉘 내에서만 작동하는 쉘 구성입니다. 그러나 새 셸을 시작하여 두 스크립트를 모두 실행하고 이를 하나의 명령으로 전달 nohup하고 이 모든 것을 백그라운드에 배치할 수 있습니다.

#!/bin/sh
nohup sh -c 'script1 args ...; script2 args ...' &

변수가 있는 경우 args ...큰따옴표를 사용해야 하며, 변수를 올바르게 이스케이프 처리하기 위해 특히 주의해야 합니다. 따라서 여기에 또 다른 접근 방식이 있습니다.

...이중 포크 포함

쉘은 직계 자식들만 알고 관심을 갖습니다. 종료하려고 할 때 백그라운드에서 여전히 실행 중인 프로세스가 있으면 경고 메시지가 표시되며, 쉘을 종료하면 이러한 직계 하위 프로세스가 종료됩니다. 해결책은 백그라운드에 하위 쉘을 배치하여 자체적으로 명령을 백그라운드에 배치하는 것입니다. 귀하의 쉘은 명령이 아닌 서브쉘에 대해서만 알고 있습니다. 하지만 이와 같은 리디렉션 마법에 의존할 수는 없으며 nohub자신만의 리디렉션을 설정해야 합니다.

#!/bin/sh
(
  # outer subshell, will be known to your shell
  (
    # inner subshell, "hidden" from your interactive shell
    script1 "$args" ... > ~/script1.stdout.log 2> ~/script1.stderr.log
    script2 "$args" ... > ~/script2.stdout.log 2> ~/script2.stderr.log
    # note that you can do normal quoting here
  ) &
) &

관련 정보