tiben/crontab-manager

一个用于管理 Linux cron 任务的库。

v1.4.0 2023-05-02 16:54 UTC

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

贡献

... 欢迎贡献 :)