저는 3개의 명령을 실행해야 하는 bash 스크립트를 작성 중입니다.
- 명령은
1
백그라운드에서 10초마다 실행되어야 합니다. - 명령은
2
백그라운드3
에서도 한 번 실행되어야 합니다. - 또한 명령은
1
제대로 작동하는 데 필요한 마지막 두 파일을 생성/업데이트하므로 명령 및 실행 전에 적어도 한 번은 성공적으로 실행되어야 합니다.2
3
그러나 이러한 조건에서 명령을 실행하는 방법을 모르겠습니다 ... a 또는 이와 유사한 것과 함께 1
a를 사용할 수 없습니다 . 왜냐하면 명령에 도달하지 못하기 때문입니다 sum .while(1)
sleep 10
2
3
내가 놓치고 있는 bash 스크립팅 개념은 무엇입니까? 어쩌면 스레드?
편집하다:명령은 명령과 .txt에 사용될 1
.txt 파일에서 정수를 증가시키는 것만큼 간단할 수 있습니다 .2
3
답변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 기능으로 이동하고 이 코드를 많이 정리할 수 있습니다.