스크립트를 활성 상태로 유지하려면 "true일 때"를 사용하는 것이 좋은 생각입니까?

스크립트를 활성 상태로 유지하려면 "true일 때"를 사용하는 것이 좋은 생각입니까?

나는 방금 다른 세계에서 UNIX로 뛰어들었고,

while true
do
  /someperlscript.pl
done

Perl 스크립트 자체에는 대상 위치에서 파일이 변경될 때 실행되는 폴더/파일 감시자가 있습니다.

이것이 while true좋은 생각입니까? 그렇지 않다면 선호되는 강력한 접근 방식은 무엇입니까?

티아

편집: 이것이 상당한 관심을 불러일으키는 것 같으므로 전체 시나리오는 다음과 같습니다. Perl 스크립트 자체는 파일 감시자를 사용하여 디렉토리를 모니터링합니다. 새 파일이 수신되면(rsync를 통해 도착) 새 파일을 선택하여 처리합니다. 이제 전달된 파일이 손상될 수 있으며(라즈베리 파이에서 묻지 마세요.) 때로는 프로세스가 이를 처리하지 못할 수도 있습니다. 우리는 아직 모든 것을 알지 못하기 때문에 그 이유를 정확히 모르겠습니다.

그러나 어떤 이유로 프로세스가 실패하면 다음 파일이 오류를 발생시켰을 수 있는 이전 파일과 전혀 관련이 없기 때문에 프로세스가 시작되어 실행되고 다음 파일을 처리하기를 원합니다.

일반적으로 나는 일종의 catch all을 사용하고 전체 코드를 둘러싸서 충돌이 발생하지 않도록 합니다. 하지만 Perl에 대해서는 잘 모르겠습니다.

내가 이해한 바에 따르면, Supervisord와 같은 것을 사용하는 것이 좋은 방법입니다.

답변1

이는 Perl 스크립트가 얼마나 빨리 반환되는지에 따라 달라집니다. 빠르게 반환되는 경우 CPU 로드를 방지하기 위해 실행 사이에 약간의 일시 중지를 삽입할 수 있습니다. 예를 들면 다음과 같습니다.

while true
do
  /someperlscript.pl
  sleep 1
done

이는 또한 스크립트가 발견되지 않거나 즉시 충돌하는 경우 CPU를 많이 사용하는 것을 방지합니다.

루프는 이러한 문제를 피하기 위해 Perl 스크립트 자체에서 가장 잘 구현됩니다.

편집하다:

충돌이 발생하는 경우 Perl 스크립트를 다시 시작하려는 유일한 목적으로 루프를 작성할 때 더 나은 접근 방식은 이를 모니터링되는 서비스로 구현하는 것이지만 정확한 방법은 운영 체제에 따라 다릅니다. 예: Solaris smf, Linux systemd 또는 cron 기반 재시작 프로그램.

답변2

사용에 대한 다른 답변은 inotify정확하지만 이 질문에 대한 답변은 아닙니다.

프로세스 관리자(예 supervisord: upstart, , 또는 runit)는 서비스 충돌을 모니터링하고 다시 시작하기 위해 특별히 설계되었습니다.

배포판에는 프로세스 관리자가 내장되어 있을 것입니다.

답변3

while true일반적인 "영원히 루프" 구조로 훌륭합니다. 다른 답변에서 알 수 있듯이 루프 내부 명령이 작동하지 않아 루프 본문이 비어 있거나 비어 있어서는 안됩니다.

Linux를 사용하는 경우 유사한 명령을 사용하여 루프를 더욱 간단하게 inotifywait만들 수 있습니다 .while

while inotifywait -qqe modify "$DIRECTORY"
do
    process_the_directory "$DIRECTORY"
done

여기서 inotifywait명령은 파일 시스템 이벤트가 발생할 때까지 기다립니다(이 경우 디렉터리의 파일이 기록될 때). 이 시점에서는 루프 본문을 성공적으로 종료하고 실행합니다. 그러면 다시 대기 상태로 돌아갑니다. 이 inotifywait명령은 디렉터리에서 어떤 일이 발생하기를 기다리기 때문에 디렉터리를 지속적으로 폴링하는 것보다 훨씬 더 효율적입니다.

답변4

Perl 스크립트가 영원히 실행되기를 원할 때 while 구문을 사용하는 이유는 무엇입니까? 심각한 문제로 인해 Perl이 실패하면 동시에 시작된 새 Perl 스크립트도 똑같이 심각하게 충돌할 수 있습니다. 계속해서 기다리십시오.
Perl을 정말로 다시 시작하려면 crontab과 실행 중인 인스턴스를 먼저 확인하는 스크립트를 고려하세요. 이렇게 하면 재부팅 후에도 스크립트가 시작됩니다.

관련 정보