쉘 스크립트에서 (1) 백그라운드에서 명령을 시작하는 방법 (2) x 초 대기 (3) 명령이 실행되는 동안 두 번째 명령을 실행할 수 있습니까?


11

이것이 내가해야 할 일입니다.

  1. 백그라운드에서 프로세스 A를 시작하십시오.
  2. x 초 동안 기다립니다
  3. 포 그라운드에서 프로세스 B 시작

어떻게 기다릴 수 있습니까?

나는 '수면'이 모든 것을 멈추는 것처럼 보이며 실제로 프로세스 A가 완전히 끝나기를 기다리는 것을 원하지 않습니다. 시간 기반 루프를 보았지만 더 깨끗한 것이 있는지 궁금합니다.


4
이미 시도한 것의 간단한 예를 제공하여이 질문을 강화하는 것이 좋습니다.
Andy Dalton

10
sleep프로세스 A 를 중단 시키는 인상을 어디서 얻 습니까? 사용중인 테스트 프로세스 또는이를 나타내는 출력을 보여줄 수 있습니까? 프로세스 A 중지되면 백그라운드에서 실행되는 동안 터미널에서 읽기를 시도하고 그 이유 때문에 관련 항목이 아닌 중지 될 가능성이 높습니다 sleep.
찰스 더피

3
... 그 경우 경우, process_a </dev/null &자사의 표준 입력을 첨부합니다 /dev/null오히려 TTY보다, 그리고 그 문제를 방지하기에 충분할 수있다.
찰스 더피

내 경험에서 수면은 현재 프로세스 만 차단하므로 이전에 &
MADforFUNandHappy

답변:


28

내가 당신의 질문을 오해하지 않는 한, 간단히 다음과 같은 짧은 스크립트로 얻을 수 있습니다.

#!/bin/bash

process_a &
sleep x
process_b

(그리고 종료하기 전에 wait스크립트가 끝날 때까지 기다리려면 끝에 추가를 추가 하십시오 process_a).

@BaardKopperud가 제안한 것처럼 스크립트가 없어도 단일 라이너 로이 작업을 수행 할 수도 있습니다.

process_a & sleep x ; process_b

6
필요하지 않습니다. bash시스템을 포함한 모든 쉘이 수행 sh하므로 스크립트의 bash에 종속성을 추가 할 필요가 없습니다.
Stéphane Chazelas

4
또는 간단히 : process_a & sleep x; process_b
Baard Kopperud '

9

백그라운드 제어 연산자 (&) 를 사용하여 백그라운드 에서 프로세스를 실행하고 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
...
...
...

2
질문은 " 포 그라운드 에서 프로세스 B를 시작"하도록 요청합니다 .
Sparhawk

1
@Sparhawk 와우. 완전히 오해-설명이 없습니다. 헤드 업 감사합니다-코드가 수정되었습니다. 당신의 사용자 이름, btw에서 심각한 향수.
igal December

1
걱정 마! (또한 사용자 이름은 원래의 참조했다 이 녀석 ...하지만 난 단지 나중에는 Eddings 문자 깨달았다 그리고 내가 그 책을 다시 읽을 수 있습니다!)
Sparhawk

5

나는 @ 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 루프입니다.


2
이러한 종료 ​​코드를 다음과 같이 스크립트의 종료 상태에 반영 할 수 있습니다.A & sleep x; B; ret=$?; wait "$!" || exit "$ret"
Stéphane Chazelas

1
@ StéphaneChazelas 좋은 생각입니다. 하나 또는 둘 다 실패하는 경우 0이 아닌 종료 코드가 반환되도록 코드를 업데이트했습니다.
Trevor Boyd Smith

OP는 process_b포 그라운드에서 실행 되기를 원합니다 . 아마도 실행중인 process_a동안 종료 process_b할 수는 있지만 직접 wait전경 process_b의 종료 상태를 수집 한 후에도 여전히 종료 상태를 얻을 수 $?있습니다.
Peter Cordes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.