매월 n번째 날이 아닌 5일마다 Perl 스크립트를 반복합니다.

매월 n번째 날이 아닌 5일마다 Perl 스크립트를 반복합니다.

현재 다른 프로토콜에 대해 메모리 집약적인 호출을 수행하는 Perl 스크립트가 있습니다. 이를 완료하려면 약 20-25GB의 메모리가 필요합니다. 그리고 시간은 8~15분 정도 소요됩니다. 완료되면 데이터를 처리하고 내 Discord 봇에 제출하는 다른 Perl 스크립트로 데이터를 내보냅니다.

내가 겪은 문제;

이 코드를 5일마다 실행해야 합니다. 매주 5일이나 매월 5일이 아니라 5일마다. 프로토콜은 5일마다 새로운 정보를 제공합니다.

perl1을 사용하여 perl2를 호출하고 perl2를 431000초(perl2를 포함하는 데 걸리는 시간 제외) 동안 절전 모드로 두었다가 다시 perl1을 호출하면 이것이 나쁜 계획입니까?

나는 p1이 p2를 호출하고 p2가 p1을 다시 호출할 때 많은 Perl 프로세스가 열려 있을 수 있다고 생각하기 시작했습니다. 5일 동안 잠을 잘 수 있을지, 아니면 과정이 저절로 끝날지조차 모르겠습니다. 나는 이것을 수행하는 더 좋은 방법이 있다는 것을 알고 있습니다.

cron을 조사해봐도 시나리오와 실제로 일치하는 항목이 생각나거나 찾을 수 없습니다.

시간이 10월 20일 오후 4시 44분이라고 가정해 보겠습니다. 다음 데이터는 10월 25일 오후 4시 44분에 공개되며, 이후 30일, 11월 4일 등으로 공개됩니다.

시간은 변하지 않습니다. 시간은 언제나 오후 4시 44분. 나는 이것을 달성하는 가장 안전하고 효율적인 방법을 모릅니다. 프로토콜 데이터를 있는 그대로 읽기 위해 16GB RAM 시스템에서 8GB 스왑을 사용했습니다. 끝없는 프로세스가 추가 리소스를 차지하면서 실행되는 것을 원하지 않습니다.

서버가 우분투에 있습니다

감사해요

답변1

cron이런 종류의 일에 그다지 유연하지 않기 때문에 한 번에 5일 동안 잠을 자는 것은 몇 가지 면에서 완전히 신뢰할 수는 없습니다.

한 가지 해결책은 "5일마다" 논리를 래퍼 스크립트에 굽고 cron매일 실행되도록 설정하는 것입니다. 따라서 그러한 방법은 다음 중 하나입니다.

unix_day=$(($(date +%s) / (60*60*24)))
modulus=$((unix_day % 5))
[ "${modulus}" -eq 0 ] && perl yourScript.pl

이는 결정적이며 에포크 이후의 일수를 기준으로 5일마다 실행됩니다.

특정 날짜를 5일의 기준으로 사용하려면 이렇게 하면 됩니다. 이 예에서 매직 시작 날짜는 2022년 10월 13일(어제)입니다. 사용 사례에 따라 설정해야 합니다.

my_epoch=$(($(date -d"2022-10-13 04:44" +%s) / (60*60*24)))
unix_day=$(($(date -d 04:44 +%s) / (60*60*24)))
modulus=$(((unix_day - my_epoch) % 5))
[ "${modulus}" -eq 0 ] && perl yourScript.pl

답변2

또 다른 옵션은 다음을 사용하는 것입니다 at.

at -f script 16:44 + 5 days

script나열된 명령은 5일 후 오후 4시 44분에 실행됩니다.

이 기능을 사용하면 작업 일정이 자동으로 변경되도록 하여 5일마다 작업 일정을 설정할 수 있습니다. 작업에서 무슨 일이 일어나더라도 5일 후에 다시 실행되도록 하려면 이것이 가장 먼저 수행되어야 합니다.

script쉘 명령이 포함되어야 하므로 Perl 스크립트에 대한 호출이 포함되어야 합니다. atPerl 스크립트에 대한 직접 호출을 요청할 수 없습니다. 작업은 at해당 작업을 먼저 호출한 사용자로 실행 되므로 at적절한 사용자로 먼저 실행해야 합니다(체인을 시작하려면 수동 호출).

다음 예약된 작업을 취소하여 체인을 중지하려면 다음을 사용하여 해당 식별자를 찾으십시오.

atq

로 삭제하세요 atrm.

관련 정보