Biblioteca PHP para gerenciar trabalhos programaticamente do GNU/Linux Cron.
Isso permite que você:
crontab (já deve estar instalado em sua distribuição).sudo , se você deseja gerenciar o Crontab de outro usuário que o usuário de tempo de execução sem ter problemas corretos (veja abaixo) A biblioteca pode ser instalada usando o Composer.
composer require tiben/crontab-manager ~1.0
A biblioteca é composta por três classes:
CrontabJob é uma classe de entidade que representa um trabalho de Cron.CrontabRepository é usado para persistir/recuperar seus trabalhos de cron.CrontabAdapter lida com a persistência dos empregos no Crontab.Para trabalhar, o Crontabrepository precisa de uma instância do Crontabadapter.
$crontabRepository = new CrontabRepository(new CrontabAdapter());
Suponha que você queira criar um novo trabalho que consista em lançar o comando "df >> /tmp/df.log" todos os dias às 23:30. Você pode fazer isso de duas maneiras.
De maneira pura de 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
Da sequência de sintaxe Cron Raw usando um método de fábrica:
$crontabJob = CrontabJob::createFromCrontabLine('30 23 * * * df >> /tmp/df.log');
Agora você pode adicionar seu novo Cronjob no repositório Crontab e persistir todas as mudanças no Crontab.
$crontabRepository->addJob($crontabJob);
$crontabRepository->persist();
Suponha que queremos modificar a hora de um cronjob já existente. Encontrar trabalhos de existência é feito usando algumas expressões regulares. O regex é aplicado a toda a linha Crontab.
$results = $crontabRepository->findJobByRegex('/Logging disk usage/');
$crontabJob = $results[0];
$crontabJob->setHours(21);
$crontabRepository->persist();
Você pode remover um trabalho como este:
$results = $crontabRepository->findJobByRegex('/Logging disk usage/');
$crontabJob = $results[0];
$crontabRepository->removeJob($crontabJob);
$crontabRepository->persist();
Nota: Como os trabalhos da CRON são correspondidos internamente por referência, eles devem ser obtidos anteriormente no repositório ou adicionados anteriormente.
Esse recurso permite gerenciar o crontab de outro usuário que o usuário que lançou o tempo de execução. Isso pode ser útil quando o usuário do tempo de execução for www-data , mas o proprietário do Crontab que você deseja editar é sua própria conta de usuário do Linux.
Para fazer isso, basta passar no nome de usuário do proprietário de Crontab como parâmetro do construtor Crontabadapter. Suponha que você seja www-data e deseja editar o crontab do usuário bobby :
$crontabAdapter = new CrontabAdapter('bobby');
$crontabRepository = new CrontabRepository($crontabAdapter);
Usando dessa maneira, você encontrará problemas de direitos de usuário. Isso pode ser tratado editando seu arquivo sudoers usando 'visudo'.
Se você deseja permitir que o usuário www-data edite o Crontab do usuário bobby , adicione esta linha:
www-data ALL=(bobby) NOPASSWD: /usr/bin/crontab
O que diz a Sudo para não pedir senha quando o usuário www-data liga crontab como usuário bobby usando sudo
Agora, você pode acessar o crontab do usuário bobby assim:
$crontabAdapter = new CrontabAdapter('bobby', true);
$crontabRepository = new CrontabRepository($crontabAdapter);
Observe o segundo parâmetro true da chamada do construtor Crontabadapter. Este booleano diz ao Crontabadapter para usar sudo internamente ao ligar crontab .
Você pode ativar ou desativar seus trabalhos Cron usando o método setEnabled() de um objeto Cronjob de acordo:
$crontabJob->setEnabled(false);
Isso prenderá seu trabalho de cron com um # em seu crontab ao persistir.
Além disso, se você não puder ler o Crontabs de outro usuário ou se estiver em uma arquitetura distribuída, onde os Crons não são executados na máquina que executa os trabalhos, poderá criar qualquer outro adaptador para sua arquitetura implementando o CrontabAdapterInterface .
Você pode instanciar o CrontabRepository com seu adaptador.
Os testes foram gravados usando Phpunit e requerem a versão 5.3+. Para executar testes:
$ phpunit <crontab-library-path>/tests
Se você instalou a biblioteca usando o Composer e instalou dependências de dev, poderá executá-las usando a phpunit incluída como dependência:
$ ./vendor/bin/phpunit <crontab-library-path>/tests
... são bem -vindos :)