이것이 내가 일어나야 할 일입니다:
- 백그라운드에서 프로세스 A 시작
- x초만 기다려
- 포그라운드에서 프로세스 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 루프입니다.