백그라운드에서 명령을 여러 번 실행(bash 스크립트)

백그라운드에서 명령을 여러 번 실행(bash 스크립트)

저는 3개의 명령을 실행해야 하는 bash 스크립트를 작성 중입니다.

  • 명령은 1백그라운드에서 10초마다 실행되어야 합니다.
  • 명령은 2백그라운드 3에서도 한 번 실행되어야 합니다.
  • 또한 명령은 1제대로 작동하는 데 필요한 마지막 두 파일을 생성/업데이트하므로 명령 및 실행 전에 적어도 한 번은 성공적으로 실행되어야 합니다.23

그러나 이러한 조건에서 명령을 실행하는 방법을 모르겠습니다 ... a 또는 이와 유사한 것과 함께 1a를 사용할 수 없습니다 . 왜냐하면 명령에 도달하지 못하기 때문입니다 sum .while(1)sleep 1023

내가 놓치고 있는 bash 스크립팅 개념은 무엇입니까? 어쩌면 스레드?

편집하다:명령은 명령과 .txt에 사용될 1.txt 파일에서 정수를 증가시키는 것만큼 간단할 수 있습니다 .23

답변1

내가 놓치고 있는 bash 스크립팅 개념은 무엇입니까? 어쩌면 스레드?

작업 통제. 백그라운드에서 프로세스를 시작할 수 있으며 프로세스 ID와 종료 상태를 알면 프로세스를 매우 세밀하게 제어할 수 있습니다.

백그라운드 명령의 PID를 얻으려면 이 $!변수를 사용하십시오.

백그라운드 명령의 종료 상태를 얻으려면 wait()해당 PID를 사용하고 제공하십시오.wait()명령이 종료되지 않으면 호출이 차단됩니다.. 이 차단이 문제인 경우(아마도 귀하의 경우일 수 있음) 프로세스를 수집할 준비가 되었는지 확인하기 위해 ps호출하기 전에 검사(또는 다른 방법)를 수행 할 수 있습니다 wait(). 일반적으로 설정할 워치독이나 다른 방법이 있을 때입니다. 루프의 작업 실행 시간 제한.

다음 루프 기반 상용구를 고려해보세요.

complete=0
cycles=0
# Task 1
sleep 200 &
pid=$!
while [[ complete -eq 0 ]]; then
    ps -o pid= -p $pid > /dev/null
    if [[ $? -ne 0 ]]; then
        # Signal complete to logic below
        complete=1
        break;
    fi
    # Perform some timeout / cycle check to give up on this task
    cycles=$((cycles + 1))
    if [[ $cycles -gt 100 ]]; then # whatever, this is just a simple watchdog example
        break;
    fi
    # Optional sleep
    sleep 1
done
if [[ $complete -eq 1 ]]; then
    # Process the command's exit status
    wait $pid
    if [[ $? -ne 0 ]]; then
        : # handle command failed perhaps
    else
        : # do other things, assuming exit of 0 is a good thing
    fi
else
    # Process a command watchdog failure
    kill -9 $pid # come what may
fi

보다 복잡한 작업 제어를 위해 명령 확인 및 주기 관리를 bash 기능으로 이동하고 이 코드를 많이 정리할 수 있습니다.

관련 정보