tiben / crontab-manager
一个用于管理 Linux cron 任务的库。
Requires
- php: >= 5.3
Requires (Dev)
- phpunit/phpunit: ^4.8.36|^5.7
This package is not auto-updated.
Last update: 2024-09-17 23:20:16 UTC
README
PHP 库,用于以编程方式管理 GNU/Linux 的 cron 作业。
它使您能够
- 用 PHP 处理 cron 作业。
- 创建新的 Cron 作业。
- 更新现有的 cron 作业。
- 使用一些 sudo 技巧管理除运行时用户之外的其他用户的 cron 作业(见下文)。
要求
- PHP 5.3+
crontab
命令行工具(应已安装在你的发行版中)。sudo
,如果你想在运行时用户之外管理另一个用户的 crontab 而不遇到权限问题(见下文)
安装
可以使用 Composer 安装此库。
composer require tiben/crontab-manager ~1.0
用法
该库由三个类组成
CrontabJob
是一个实体类,代表一个 cron 作业。CrontabRepository
用于持久化/检索您的 cron 作业。CrontabAdapter
处理 crontab 中的 cron 作业持久化。
实例化存储库
为了运行,CrontabRepository 需要一个 CrontabAdapter 的实例。
$crontabRepository = new CrontabRepository(new CrontabAdapter());
创建新作业并将其持久化到 crontab
假设您想要创建一个新作业,该作业每天 23:30 启动命令 "df >> /tmp/df.log"。您可以通过两种方式完成。
-
纯面向对象方式
$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
-
使用工厂方法从原始 cron 语法字符串创建
$crontabJob = CrontabJob::createFromCrontabLine('30 23 * * * df >> /tmp/df.log');
现在,您可以将新的 cron 作业添加到 crontab 存储库,并将所有更改持久化到 crontab。
$crontabRepository->addJob($crontabJob);
$crontabRepository->persist();
从 crontab 存储库中查找特定的 cron 作业并更新它
假设我们想要修改一个已存在的 cron 作业的小时。查找现有作业是通过一些正则表达式完成的。正则表达式应用于整个 crontab 行。
$results = $crontabRepository->findJobByRegex('/Logging\ disk\ usage/');
$crontabJob = $results[0];
$crontabJob->setHours(21);
$crontabRepository->persist();
从 crontab 中删除 cron 作业
您可以通过这种方式删除一个作业
$results = $crontabRepository->findJobByRegex('/Logging\ disk\ usage/');
$crontabJob = $results[0];
$crontabRepository->removeJob($crontabJob);
$crontabRepository->persist();
注意:由于 cron 作业是内部按引用匹配的,因此必须先从存储库中获取或先前添加。
与除运行时用户之外的其他用户的 crontab 一起工作
此功能允许您管理除启动运行时用户之外的其他用户的 crontab。当运行时用户是 www-data
但您想要编辑的 crontab 的所有者是您自己的 Linux 用户帐户时,这可能很有用。
为此,只需将 crontab 所有者的用户名作为 CrontabAdapter 构造函数的参数传递。假设您是 www-data
并且您想要编辑用户 bobby
的 crontab
$crontabAdapter = new CrontabAdapter('bobby');
$crontabRepository = new CrontabRepository($crontabAdapter);
使用这种方式,您可能会遇到用户权限问题。这可以通过编辑您的 sudoers 文件来处理,使用 'visudo'。
如果您想允许用户 www-data
编辑用户 bobby
的 crontab,请添加以下行
www-data ALL=(bobby) NOPASSWD: /usr/bin/crontab
这告诉 sudo 当用户 www-data
使用 sudo
作为用户 bobby
调用 crontab
时不要要求密码
现在,您可以像这样访问用户 bobby
的 crontab
$crontabAdapter = new CrontabAdapter('bobby', true);
$crontabRepository = new CrontabRepository($crontabAdapter);
注意 CrontabAdapter 构造函数调用中的第二个参数 true
。这个布尔值告诉 CrontabAdapter 在调用 crontab
时内部使用 sudo
。
启用或禁用 cron 作业
您可以通过使用 CronJob 对象的 setEnabled()
方法相应地启用或禁用您的 cron 作业
$crontabJob->setEnabled(false);
在持久化时,这将使用 #
预先添加到您的 crontab 中。
编写自己的适配器
此外,如果您无法读取另一个用户的 crontab 或者您在一个分布式架构中,其中 cron 任务不在执行任务的机器上运行,您可以通过实现 CrontabAdapterInterface
来创建适用于您架构的任何其他适配器。
然后您可以使用您的适配器实例化 CrontabRepository
。
单元测试
使用 PHPUnit 编写的测试需要版本 5.3+。要执行测试
$ phpunit <crontab-library-path>/tests
如果您使用 Composer 安装了库并安装了开发依赖项,您可以使用包含的 PHPUnit 执行它们
$ ./vendor/bin/phpunit <crontab-library-path>/tests
贡献
... 欢迎贡献 :)