PHP -Bibliothek, um programmatisch GNU/Linux -Cron -Jobs zu verwalten.
Es ermöglicht Ihnen:
crontab Command-Line-Dienstprogramm (sollte bereits in Ihrer Verteilung installiert sein).sudo , wenn Sie Crontab eines anderen Benutzer als Laufzeitbenutzer verwalten möchten, ohne auf die richtigen Probleme zu laufen (siehe unten) Die Bibliothek kann mit Composer installiert werden.
composer require tiben/crontab-manager ~1.0
Die Bibliothek besteht aus drei Klassen:
CrontabJob ist eine Entitätsklasse, die einen Cron -Job darstellt.CrontabRepository wird verwendet, um Ihre Cron -Jobs zu bestehen/abzurufen.CrontabAdapter übernimmt Cron Jobs Beharrlichkeit im Crontab.Um zu arbeiten, benötigt das Crontabrepository eine Instanz von Crontabadapter.
$crontabRepository = new CrontabRepository(new CrontabAdapter());
Nehmen wir an, Sie möchten einen neuen Job erstellen, der jeden Tag um 23:30 Uhr aus dem Befehl "df >> /tmp/df.log" besteht. Sie können es auf zwei Arten tun.
In reiner Weise:
$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
Aus der RAW Cron Syntax -Zeichenfolge unter Verwendung einer Werksmethode:
$crontabJob = CrontabJob::createFromCrontabLine('30 23 * * * df >> /tmp/df.log');
Sie können jetzt Ihren neuen Cronjob im Crontab -Repository hinzufügen und alle Änderungen am Crontab bestehen.
$crontabRepository->addJob($crontabJob);
$crontabRepository->persist();
Angenommen, wir möchten die Stunde eines bereits vorhandenen Cronjobs ändern. Es wird mit einigen regulären Ausdrücken erledigt. Der Regex wird auf die gesamte Crontab -Linie angewendet.
$results = $crontabRepository->findJobByRegex('/Logging disk usage/');
$crontabJob = $results[0];
$crontabJob->setHours(21);
$crontabRepository->persist();
Sie können einen solchen Job entfernen:
$results = $crontabRepository->findJobByRegex('/Logging disk usage/');
$crontabJob = $results[0];
$crontabRepository->removeJob($crontabJob);
$crontabRepository->persist();
HINWEIS: Da Cron -Jobs intern mit Referenz übereinstimmen, müssen sie zuvor aus dem Repository oder zuvor hinzugefügt werden.
Mit dieser Funktion können Sie den Crontab eines anderen Benutzers verwalten als der Benutzer, der die Laufzeit gestartet hat. Dies kann nützlich sein, wenn der Laufzeitbenutzer www-data ist, der Eigentümer des Crontab, das Sie bearbeiten möchten, ist Ihr eigenes Linux-Benutzerkonto.
Geben Sie dazu einfach den Benutzernamen des Crontab -Eigentümers als Parameter des Crontabadapter -Konstruktors weiter. Angenommen, Sie sind www-data und möchten das Crontab von User bobby bearbeiten:
$crontabAdapter = new CrontabAdapter('bobby');
$crontabRepository = new CrontabRepository($crontabAdapter);
Verwenden Sie diese Weise in den Fragen der Benutzerrechte. Dies kann behandelt werden, indem Ihre Sudoers -Datei mit 'Visudo' bearbeitet wird.
Wenn Sie dem Benutzer www-data zulassen möchten, das Crontab von User bobby zu bearbeiten, fügen Sie diese Zeile hinzu:
www-data ALL=(bobby) NOPASSWD: /usr/bin/crontab
Dies gibt Sudo an, nicht nach Passwort zu fragen, wenn der Benutzer www-data crontab als Benutzer bobby mit sudo aufruft
Jetzt können Sie auf das Crontab des Benutzers bobby wie folgt zugreifen:
$crontabAdapter = new CrontabAdapter('bobby', true);
$crontabRepository = new CrontabRepository($crontabAdapter);
Beachten Sie, dass der zweite Parameter für den Aufruf von Crontabadapter Constructor true . Dieser Boolesche sagt dem Crontabadapter, sudo intern zu verwenden, wenn er crontab anruft.
Sie können Ihre Cron -Jobs aktivieren oder deaktivieren, indem Sie die methode setEnabled() eines Cronjob -Objekts entsprechend verwenden:
$crontabJob->setEnabled(false);
Dies wird Ihren Cron -Job mit einer # in Ihrem Crontab vorbereiten, wenn Sie ihn bestehen.
Wenn Sie die Crontabs eines anderen Benutzers nicht lesen können oder wenn Sie sich in einer verteilten Architektur befinden, in der Crors nicht auf dem Computer ausgeführt werden, um die Jobs auszuführen, können Sie einen anderen Adapter für Ihre Architektur erstellen, indem Sie das CrontabAdapterInterface implementieren.
Sie können dann das CrontabRepository mit Ihrem Adapter instanziieren.
Tests wurden mit Phpunit geschrieben und erfordern Version 5.3+. Tests ausführen:
$ phpunit <crontab-library-path>/tests
Wenn Sie die Bibliothek mit Composer und installierten Dev-Abhängigkeiten installiert haben, können Sie sie mithilfe des enthaltenen Phpunits als Abhängigkeit ausführen:
$ ./vendor/bin/phpunit <crontab-library-path>/tests
... sind willkommen :)