A library for managing linux cron jobs.
PHP library to manage programmatically GNU/Linux cron jobs.
It enables you to :
- Deal with your cron jobs in PHP.
- Create new Cron jobs.
- Update existing cron jobs.
- Manage cron jobs of others users than runtime user using some sudo tricks (see below).
- PHP 5.3+
crontabcommand-line utility (should be already installed in your distribution).
sudo, if you want to manage crontab of another user than runtime user without running into right issues (see below)
The library can be installed using Composer.
composer require tiben/crontab-manager ~1.0
The library is composed of three classes:
CrontabJobis an entity class which represents a cron job.
CrontabRepositoryis used to persist/retrieve your cron jobs.
CrontabAdapterhandles cron jobs persistance in the crontab.
In order to work, the CrontabRepository needs an instance of CrontabAdapter.
$crontabRepository = new CrontabRepository(new CrontabAdapter());
Suppose you want to create an new job which consists of launching the command "df >> /tmp/df.log" every day at 23:30. You can do it in two ways.
- In Pure oo way :
$crontabJob = new CrontabJob(); $crontabJob->minutes = '30'; $crontabJob->hours = '23'; $crontabJob->dayOfMonth = '*'; $crontabJob->months = '*'; $crontabJob->dayOfWeek = '*'; $crontabJob->taskCommandLine = 'df >> /tmp/df.log'; $crontabJob->comments = 'Logging disk usage'; // Comments are persisted in the crontab
- From raw cron syntax string using a factory method :
$crontabJob = CrontabJob::createFromCrontabLine('30 23 * * * df >> /tmp/df.log');
You can now add your new cronjob in the crontab repository and persist all changes to the crontab.
Suppose we want to modify the hour of an already existing cronjob. Finding existings jobs is done using some regular expressions. The regex is applied to the entire crontab line.
$results = $crontabRepository->findJobByRegex('/Logging\ disk\ usage/'); $crontabJob = $results; $crontabJob->hours = '21'; $crontabRepository->persist();
You can remove a job like this :
$results = $crontabRepository->findJobByRegex('/Logging\ disk\ usage/'); $crontabJob = $results; $crontabRepository->removeJob($crontabJob); $crontabRepository->persist();
Note: Since cron jobs are internally matched by reference, they must be previously obtained from the repository or previously added.
This feature allows you to manage the crontab of another user than the user who launched the runtime. This can be useful when the runtime user is
www-data but the owner of the crontab you want to edit is your own linux user account.
To do this, simply pass the username of the crontab owner as parameter of the CrontabAdapter constructor. Suppose you are
www-data and you want to edit the crontab of user
$crontabAdapter = new CrontabAdapter('bobby'); $crontabRepository = new CrontabRepository($crontabAdapter);
Using this way you will propably run into user rights issues.
This can be handled by editing your sudoers file using 'visudo'.
If you want to allow user
www-data to edit the crontab of user
bobby, add this line:
www-data ALL=(bobby) NOPASSWD: /usr/bin/crontab
which tells sudo not to ask for password when user
crontab as user
Now, you can access to the crontab of user
bobby like this :
$crontabAdapter = new CrontabAdapter('bobby', true); $crontabRepository = new CrontabRepository($crontabAdapter);
Note the second parameter
true of the CrontabAdapter constructor call. This boolean tells the CrontabAdapter to use
sudo internally when calling
You can enable or disable your cron jobs by setting the
enabled attribute of a CronJob object accordingly :
$crontabJob->enabled = false;
This will have the effect to prepend your cron job by a "#" in your crontab when persisting it.