nohup 백그라운드 명령을 이미 실행한 경우 새 백그라운드 명령을 순차적으로 실행하려면 어떻게 해야 합니까?

nohup 백그라운드 명령을 이미 실행한 경우 새 백그라운드 명령을 순차적으로 실행하려면 어떻게 해야 합니까?

이미 명령 1을 실행하는 백그라운드가 있다고 가정해 보겠습니다.

nohup command1 &

이제 command2를 백그라운드에 제출하고 싶지만 command2가 즉시 실행되는 것을 원하지 않습니다. command1이 완료된 후 command2가 실행을 시작하길 원합니다.

이 목표를 어떻게 달성할 수 있나요?

답변1

어떤 쉘을 실행하고 있는지 말하지 않았습니다. 이것이 도움이 됩니다. 병렬로 실행되도록 생성된 소프트웨어를 순차적으로 사용해야 합니다. 많은 사람들에게 짧은 대답은 불가능하다는 것입니다. 하지만 시도해 볼 수 있는 몇 가지 아이디어가 있습니다.

첫 번째(순서를 보장하지 않음)는 배치 명령을 사용하여 작업을 배치 대기열에 제출하는 것입니다. 이것은 매우 간단합니다.

또 다른 접근 방식은 일괄 방식으로 명령을 보낼 수 있는 스크립트를 작성하는 것입니다.

백그라운드에서 실행되고 한 번에 자신 이외의 하나의 백그라운드 작업만 완료하도록 허용하는 스크립트를 작성할 수 있을 것 같습니다.

그 중에서 가장 좋은 옵션은 일괄 명령입니다. 이 명령의 목적은 바로 이 명령입니다. 상황에 대해 더 많이 알면 답변을 더 잘 맞춤화할 수 있습니다. 예를 들어, 시퀀스에서 다음 명령을 실행하기 전에 이전 명령의 결과를 확인해야 합니까? 모든 명령을 파일에 넣고 해당 파일을 실행하는 것은 어떨까요?

더 많이 알려주시면 더 많은 도움을 드릴 수 있습니다. 코스타

답변2

bash가 사용자와 동일한 셸에서 작업을 시작한다고 가정하면 내장 명령을 사용할 수 있습니다 wait.

wait: wait [id]
Wait for job completion and return exit status.

Waits for the process identified by ID, which may be a process ID or a
job specification, and reports its termination status.  If ID is not
given, waits for all currently active child processes, and the return
status is zero.  If ID is a a job specification, waits for all processes
in the job's pipeline.

그래서:

sleep 60 &
wait %%; echo nextjobs; sleep 60 &

안타깝게도 wait이는 기다리고 있는 프로세스의 상위 프로세스와 동일한 셸에서 호출되어야 합니다. 즉, 백그라운드에서 기다릴 수 없습니다. 즉, 위의 예는 첫 번째 작업이 완료될 때까지 차단된 다음 두 번째 작업을 백그라운드에 제출합니다.

답변3

Unix에서 이 fuser명령을 구현하는 경우 가장 쉬운 방법은 다음과 같습니다.

while [ "$(fuser nohup.out 2>/dev/null)" ]; do sleep 2; done
command2

command1과 동일한 디렉터리에서 실행해야 합니다.

약간의 설명:

run 명령을 사용하면 명령 표준 출력 및 오류를 저장하기 위해 nohup라는 파일이 생성됩니다 .nohup.out

제가 제안하고 싶은 명령은 nohup.out파일이 아직 열려 있는지 확인하기 위해 파일을 모니터링하는 것입니다. 이 경우 첫 번째 프로세스가 command1아직 실행 중임을 의미합니다. 이 경우 while루프는 2초를 기다린 후 다시 시도합니다. command1완료 되면 nohup.out파일은 더 이상 사용되지 않으며 루프가 유지되어 command2실행이 허용됩니다. 다른 프로세스가 나중에 이를 사용하는 경우 nohup.out(예: 누군가 실행 중인 경우) 에 유의하세요 tail -f nohup.out.


편집하다: 운영 체제에서 이를 제공하지 않는 경우 fuser이식 가능한 방법은 다음과 같습니다.

1: 백그라운드 프로세스의 프로세스 ID를 식별합니다. 방금 nohup명령을 실행한 경우 nohup 뒤에 다음 명령을 입력하여 가져옵니다.

pid=$!

그렇지 않으면 다음 중 하나를 사용하십시오.

pgrep command1
ps -eo pid,comm| grep -w [c]ommand1
top

또는 유사한 방법을 사용하여 pid그에 따라 변수를 설정하십시오.

완료되면 다음 명령을 실행합니다.

while kill -0 $pid; do sleep 2; done
command2 

command1시작하기 전에 완료될 때 까지 기다립니다 command2.

답변4

서브쉘을 만드시겠습니까?

nohup (commancd1;command2) &

관련 정보