쉘 스크립트에서 (1) 백그라운드에서 명령을 시작하려면 (2) x초 동안 기다리십시오 (3) 해당 명령이 실행되는 동안 두 번째 명령을 실행하려면 어떻게 해야 합니까?

쉘 스크립트에서 (1) 백그라운드에서 명령을 시작하려면 (2) x초 동안 기다리십시오 (3) 해당 명령이 실행되는 동안 두 번째 명령을 실행하려면 어떻게 해야 합니까?

이것이 내가 일어나야 할 일입니다:

  1. 백그라운드에서 프로세스 A 시작
  2. x초만 기다려
  3. 포그라운드에서 프로세스 B 시작

어떻게 하면 기다리게 할 수 있나요?

나는 "잠자기"가 모든 것을 멈추는 것처럼 보이며 실제로 프로세스 A가 완전히 완료될 때까지 "기다리고" 싶지 않습니다. 시간 기반 루프를 본 적이 있지만 더 깔끔한 것이 있는지 궁금합니다.

답변1

귀하의 질문을 오해한 것이 아니라면 다음과 같은 짧은 스크립트를 사용하여 간단히 해결할 수 있습니다.

#!/bin/bash

process_a &
sleep x
process_b

( wait스크립트가 종료되기 전에 완료될 때까지 기다리도록 하려면 process_a끝에 추가 항목을 추가하십시오).

스크립트 없이 한 줄의 코드로 수행할 수도 있습니다(@BaardKopperud가 제안한 대로).

process_a & sleep x ; process_b

답변2

당신은 그것을 사용할 수 있습니다백그라운드 제어 연산자(&)백그라운드에서 프로세스 실행sleep주문하다두 번째 프로세스를 실행하기 전에 기다리십시오. 예:

#!/usr/bin/env bash
# script.sh

command1 &
sleep x
command2

다음은 타임스탬프가 표시된 일부 메시지를 인쇄하는 두 명령의 예입니다.

#!/usr/bin/env bash

# Execute a process in the background
echo "$(date) - Running first process in the background..."
for i in {1..1000}; do
    echo "$(date) - I am running in the background";
    sleep 1;
done &> background-process-output.txt &

# Wait for 5 seconds
echo "$(date) - Sleeping..."
sleep 5 

# Execute a second process in the foreground
echo "$(date) - Running second process in the foreground..."
for i in {1..1000}; do
    echo "$(date) - I am running in the foreground";
    sleep 1;
done

이를 실행하여 원하는 동작이 나타나는지 확인합니다.

user@host:~$ bash script.sh

Fri Dec  1 13:41:10 CST 2017 - Running first process in the background...
Fri Dec  1 13:41:10 CST 2017 - Sleeping...
Fri Dec  1 13:41:15 CST 2017 - Running second process in the foreground...
Fri Dec  1 13:41:15 CST 2017 - I am running in the foreground
Fri Dec  1 13:41:16 CST 2017 - I am running in the foreground
Fri Dec  1 13:41:17 CST 2017 - I am running in the foreground
Fri Dec  1 13:41:18 CST 2017 - I am running in the foreground
Fri Dec  1 13:41:19 CST 2017 - I am running in the foreground
Fri Dec  1 13:41:20 CST 2017 - I am running in the foreground
...
...
...

답변3

@dr01의 답변이 마음에 들지만 그는 종료 코드를 확인하지 않으므로 성공했는지 알 수 없습니다.

종료 코드를 확인하는 솔루션은 다음과 같습니다.

#!/bin/bash

# run processes
process_a &
PID1=$!
sleep x
process_b &
PID2=$!
exitcode=0

# check the exitcode for process A
wait $PID1    
if (($? != 0)); then
    echo "ERROR: process_a exited with non-zero exitcode" >&2
    exitcode=$((exitcode+1))
fi

# check the exitcode for process B
wait $PID2
if (($? != 0)); then
    echo "ERROR: process_b exited with non-zero exitcode" >&2
    exitcode=$((exitcode+1))
fi
exit ${exitcode}

일반적으로 PID를 bash 배열에 저장한 다음 pid 확인은 for 루프입니다.

관련 정보