![1분마다 실행되는 Cron 작업이 순서에 맞지 않습니까?](https://linux55.com/image/33034/1%EB%B6%84%EB%A7%88%EB%8B%A4%20%EC%8B%A4%ED%96%89%EB%90%98%EB%8A%94%20Cron%20%EC%9E%91%EC%97%85%EC%9D%B4%20%EC%88%9C%EC%84%9C%EC%97%90%20%EB%A7%9E%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
저는 클라이언트 시스템에서 5분마다, 그리고 1분마다 실행하여 로그를 폴링하고 다른 애플리케이션이 외부 파일을 통해 저장하고 액세스할 수 있도록 일부 타이밍 정보를 추출하는 일부 쉘 스크립트를 설정하고 있습니다. 현재 구현은 두 개의 별도 파일에 한 줄을 작성하므로 잘 작동합니다. 프로세스를 개선하는 중이므로 이제 한 파일에는 5분마다 두 줄을 쓰고 다른 파일에는 매분 네 줄을 써야 합니다. 그러나 테스트를 통해 몇 분마다 라인이 순서대로 실행되지 않는 것으로 나타났습니다.
내 스크립트는 다음과 같습니다.
*/5 * * * * ~/myscript.pl ~/mylog | tail -3 | head -1 > ~/myreport1
*/5 * * * * ~/myscript.pl ~/mylog | tail -2 | head -1 >> ~/myreport1
* * * * * ~/myscript.pl ~/mylog | tail -8 | head -1 > ~/myreport2
* * * * * ~/myscript.pl ~/mylog | tail -7 | head -1 >> ~/myreport2
* * * * * ~/myscript.pl ~/mylog | tail -3 | head -1 >> ~/myreport2
* * * * * ~/myscript.pl ~/mylog | tail -2 | head -1 >> ~/myreport2
어떤 경우에는 몇 줄만 올바르게 실행되는 것처럼 보이고 다른 경우에는 한 줄만 기록됩니다. 파일에 기록된 전체 행 수를 계속해서 확인하지도 않습니다. 그렇지 않으면 추출하는 값이 올바르게 수집되지 않는다고 가정할 뿐입니다. 모든 cron 라인이 실행 중인지 확인하는 방법과 이러한 라인이 순서대로 발생하지 않거나 전혀 실행되지 않는 원인이 될 수 있는지 잘 모르겠습니다.
답변1
cron이 cronfile에 나타나는 순서대로 작업을 실행한다는 보장은 없습니다. 실제로 두 가지 작업을 동시에 실행할 가능성이 높습니다. 따라서 작업을 서로 종속되게 만드는 것은 결코 좋은 생각이 아닙니다. 예를 들어 cronfile에서 하나의 작업이 파일을 생성하고 다른 작업(또는 세 개)이 해당 파일에 추가됩니다. 어펜더가 먼저 시작되면 작성자는 어펜더의 작업을 효과적으로 제거합니다.
더 나은 접근 방식은 1분마다 4번 실행되는 드라이버 스크립트 myscript
와 5분마다 2번 실행되는 또 다른 드라이버 스크립트를 만드는 것입니다. 그런 다음 시간 간격당 하나의 cron 작업만 실행되도록 두 드라이버 스크립트를 모두 cron할 수 있습니다.
답변2
cron의 경우 동시에 실행되는 명령이 많습니다. Cron은 "병렬로" 실행되는 여러 하위 프로세스를 생성합니다. 즉, 어떤 방식으로든 멀티태스킹/스케줄링되어 사용 사례에 데이터 경합이 발생합니다.
문제의 경우 실제로 cron이 필요하지 않습니다. 다음과 같은 간단한 쉘 스크립트이면 충분합니다.
#!/bin/sh
function f1() {
~/myscript.pl ~/mylog | tail -3 | head -1 > ~/myreport1
~/myscript.pl ~/mylog | tail -2 | head -1 >> ~/myreport1
}
function f2() {
~/myscript.pl ~/mylog | tail -8 | head -1 > ~/myreport2
~/myscript.pl ~/mylog | tail -7 | head -1 >> ~/myreport2
~/myscript.pl ~/mylog | tail -3 | head -1 >> ~/myreport2
~/myscript.pl ~/mylog | tail -2 | head -1 >> ~/myreport2
}
while true; do
f1
f2
sleep 1
f2
sleep 1
f2
sleep 1
f2
sleep 1
f2
sleep 1
done
이제 모든 것이 정의되었습니다. 즉, 실행 순서가 보장됩니다.
at
- 또는 세션 내에서 호출하여 (백그라운드 작업으로) 시작할 수 있습니다 screen
.