2015-02-01 2 views
0

여러 시간에 서로 다른 시간에 여러 명령을 실행해야하기 때문에 명령 행 스케줄러에서 작업하고 있습니다. 얼마나 신뢰할 수있는 "at"

public static function set ($dir, $operation, $arguments = [], $options = [], $timeToWait) 
{ 

    $argumentstring = ''; 
    $optionstring = ''; 

    foreach($arguments as $argument) 
    { 
     $argumentstring .= $argument.' '; 
    } 

    if ($options) 
    { 
     foreach ($options as $key => $option) 
     { 
      $optionstring .= '--' . $key . '=\"' . $option . '\" '; 
     } 
    } 

    $command = $operation. ' ' . $argumentstring . ' ' . $optionstring; 
    return $string = exec('echo php '.$dir.'/./prices '.$command.' | /usr/bin/at -M now + '.$timeToWait. ' min'); 
} 

처음에

Schedule::set(getcwd(), 'put:acknowledge', ['Customer' => database_connector::getUserId(), 'ReportId' => ReportIdDeclaration::getReportID(), [], 5); 

처럼 호출, 크론 그 ​​이후 일정을 다른 명령, API 응답에 따라 첫 번째 프로세스를 실행합니다. 2 분마다 명령을 실행해야하므로 cronat으로 자주 발생시킵니다. cron이 작동 중이고 수동으로 호출 할 때 파일의 명령이 작동한다고 알고 있지만 작업 중 일부는 실패/실행되지 않고 있습니다.

at이 내가 필요로하는만큼 신뢰할 수 있다면이 질문에 대한 답변을 드리겠습니다. 아니면 내 코드가 내가보기에 부족하다.

그래서 내 질문에 대한 포인트는 at을 엄청난 양의 작업에 안정적으로 고려해야하며 내 소스 코드를 오류로 제어해야합니까 아니면 at은 작동하기에 충분히 신뢰할 만하다고 생각하지 말아야합니다. 순전히 programaticaly 실행 환경에서?

답변

1

우리는 'at'가 얼마나 신뢰할 만한지 알지 못하지만, 당신이 설명하는 것은 at를 사용하기위한 반 패턴의 것으로 보입니다.

작업을 순서대로 실행해야하는 경우 단일 진입 점을 사용하여 스크립트에서 연쇄 작업을 수행해야합니다.

'at'는 일반적으로 1 초 단위의 정밀도로 작업을 실행하지만 일정이 1 초 이내에 항상 실행된다는 보장은 없습니다. 그 수준의 확실성이 필요하다면 실시간 운영 체제가 필요합니다.

일부 버전의 'cron'및 'at'는로드가 특정 임계 값을 초과하는 경우 작업을 시작하지 않습니다. 그 시나리오를 제외하고 나는 atd가 (결국) 실행하지 않은 일을 받아들이는 'at'을 결코 알지 못했다.

물론 최근의 시스템은 atd 및 crond를 사용하지 않을 수 있습니다. systemd는이 기능을 지원합니다 (작동하는지 그리고 좋은 생각인지는 매우 긴 인수입니다).

여기에 표시된 코드는 'at'을 (를) 호출하는 리턴 코드를 확인하지 않습니다.

+0

고맙습니다. 매우 합리적입니다. 하나의 진입 점은 내가 매우 오랫동안 생각해 왔던 것이지만, 두 번째 스크립트가 때로는 처음 5 시부 터 10 분 후에 시작해야하기 때문에 효율적인 방법을 찾을 수 없습니다. 나에게 도움이 될만한 생각이 떠오르는가? 그 문제에 대해서는 – baao

+0

일 것이므로,'at '는 실제로 필요하지 않습니다. 작업이 다시 시작될 때까지 diff를 계산하고, 그 시간 동안'sleep()'을 계산하면됩니다. 예. cron은 첫 번째 실행을 위해 작업을 시작하고 15 분 3 초 동안 실행되며 초기 실행 후 30 분 후에 다시 실행되어야하므로 14 분 57 초 동안 대기 상태가됩니다. –

+0

@Marc B : 데몬을 실행하는 것은 그렇게 간단하지 않습니다. 시그널 핸들러를 추가하는 것 말고도 stdio와 setsid를 포크하고 닫아야한다. – symcbean