프로그래밍 방식으로 GNU/Linux CRON 작업을 관리하는 PHP 라이브러리.
그것은 당신을 가능하게합니다 :
crontab 명령 줄 유틸리티 (배포에 이미 설치되어야 함).sudo , 올바른 문제를 해결하지 않고 런타임 사용자보다 다른 사용자의 Crontab을 관리하려면 (아래 참조) 라이브러리는 작곡가를 사용하여 설치할 수 있습니다.
composer require tiben/crontab-manager ~1.0
라이브러리는 세 가지 클래스로 구성됩니다.
CrontabJob 은 Cron 작업을 나타내는 엔티티 클래스입니다.CrontabRepository Cron 작업을 지속/검색하는 데 사용됩니다.CrontabAdapter Crontab에서 Cron 작업 영구를 처리합니다.작동하기 위해서는 Crontabrepository는 Crontabadapter의 인스턴스가 필요합니다.
$crontabRepository = new CrontabRepository(new CrontabAdapter());
매일 23:30에 매일 "df >> /tmp/df.log"명령을 시작하는 새로운 작업을 만들고 싶다고 가정 해 봅시다. 두 가지 방법으로 할 수 있습니다.
순수한 OO 방식으로 :
$crontabJob = new CrontabJob();
$crontabJob
->setMinutes(30)
->setHours(23)
->setDayOfMonth('*')
->setMonths('*')
->setDayOfWeek('*')
->setTaskCommandLine('df >> /tmp/df.log')
->setComments('Logging disk usage'); // Comments are persisted in the crontab
공장 방법을 사용한 RAW CRON SYNTAX 문자열에서 :
$crontabJob = CrontabJob::createFromCrontabLine('30 23 * * * df >> /tmp/df.log');
이제 Crontab 저장소에 새 Cronjob을 추가하고 Crontab에 대한 모든 변경 사항을 지속 할 수 있습니다.
$crontabRepository->addJob($crontabJob);
$crontabRepository->persist();
이미 존재하는 Cronjob의 시간을 수정하고 싶다고 가정 해 봅시다. 존재하는 작업을 찾는 것은 정규 표현식을 사용하여 수행됩니다. Regex는 전체 Crontab 라인에 적용됩니다.
$results = $crontabRepository->findJobByRegex('/Logging disk usage/');
$crontabJob = $results[0];
$crontabJob->setHours(21);
$crontabRepository->persist();
다음과 같은 작업을 제거 할 수 있습니다.
$results = $crontabRepository->findJobByRegex('/Logging disk usage/');
$crontabJob = $results[0];
$crontabRepository->removeJob($crontabJob);
$crontabRepository->persist();
참고 : CRON 작업은 내부적으로 참조와 일치하므로 이전에 저장소에서 얻거나 이전에 추가해야합니다.
이 기능을 사용하면 런타임을 시작한 사용자보다 다른 사용자의 Crontab을 관리 할 수 있습니다. 런타임 사용자가 www-data 일 때 유용 할 수 있지만 편집하려는 Crontab의 소유자는 자신의 Linux 사용자 계정입니다.
이렇게하려면 Crontabadapter 생성자의 매개 변수로 Crontab 소유자의 사용자 이름을 전달하십시오. 당신이 www-data 이고 사용자 bobby 의 Crontab을 편집하고 싶다고 가정합니다.
$crontabAdapter = new CrontabAdapter('bobby');
$crontabRepository = new CrontabRepository($crontabAdapter);
이러한 방식으로 사용하면 사용자 권한 문제가 발생할 수 있습니다. 'Visudo'를 사용하여 Sudoers 파일을 편집하여 처리 할 수 있습니다.
사용자 www-data 사용자 bobby 의 Crontab을 편집하도록 허용하려면이 줄을 추가하십시오.
www-data ALL=(bobby) NOPASSWD: /usr/bin/crontab
사용자 www-data sudo 사용하여 사용자 bobby 로 crontab 호출 할 때 Sudo에게 암호를 요구하지 말라고 지시합니다.
이제 다음과 같은 사용자 bobby 의 Crontab에 액세스 할 수 있습니다.
$crontabAdapter = new CrontabAdapter('bobby', true);
$crontabRepository = new CrontabRepository($crontabAdapter);
Crontabadapter 생성자 호출의 두 번째 매개 변수 true 참고하십시오. 이 부울은 crontab 에 전화 할 때 Crontabadapter에게 내부적으로 sudo 사용하도록 지시합니다.
cronjob 객체의 setEnabled() 메소드를 사용하여 Cron 작업을 활성화 또는 비활성화 할 수 있습니다.
$crontabJob->setEnabled(false);
이렇게하면 CronaB에서 Cron 작업을 지속시킬 때 # 작업을 전제로 제공합니다.
또한 다른 사용자의 Crontabs를 읽을 수 없거나 작업을 실행하는 기계에서 Crons가 실행되지 않는 분산 아키텍처에있는 경우 CrontabAdapterInterface 를 구현하여 아키텍처를위한 다른 어댑터를 만들 수 있습니다.
그런 다음 어댑터로 CrontabRepository 인스턴스화 할 수 있습니다.
테스트는 PHPUnit을 사용하여 작성되었으며 버전 5.3+가 필요합니다. 테스트 실행 :
$ phpunit <crontab-library-path>/tests
Composer를 사용하여 라이브러리를 설치하고 DEV 의존성을 설치 한 경우 포함 된 PHPUNIT를 사용하여 종속성으로 실행할 수 있습니다.
$ ./vendor/bin/phpunit <crontab-library-path>/tests
... 환영합니다 :)