使用 PHP 创建、编辑和删除 crontab 作业?

Posted

技术标签:

【中文标题】使用 PHP 创建、编辑和删除 crontab 作业?【英文标题】:Use PHP to create, edit and delete crontab jobs? 【发布时间】:2011-05-24 04:33:30 【问题描述】:

是否可以使用 php 来创建、编辑和删除 crontab 作业?

我知道如何列出 Apache 用户当前的 crontab 作业:

$output = shell_exec('crontab -l');
echo $output;

但是如何用 PHP 添加一个 cron 任务呢? 'crontab -e' 只会打开一个文本编辑器,您必须在保存文件之前手动编辑条目。

以及如何使用 PHP 删除 cron 作业?同样,您必须通过 'crontab -e' 手动执行此操作。

使用这样的作业字符串:

$job = '0 */2 * * * /usr/bin/php5 /home/user1/work.php';

如何使用 PHP 将其添加到 crontab 作业列表中?

【问题讨论】:

Cron jobs using php 和 couple others 的可能副本 (hint) crontab 只是一个文件 @Gordon,谢谢。我知道一切都是一个文件,但是他们是否将 crontab 作业存储在不同发行版的同一路径中?另外需要获取Apache的用户,比如www-data,并且有root权限? 我不确定路径是否在发行版之间发生变化,但是您可以在代码中使路径成为可配置的值,然后在运行时设置它。至于用户和权限:每个用户都可以有一个 crontab 来运行具有分配给该用户的权限的作业,因此这对于您的系统设置是单独的。 另见***.com/q/3186471/632951 【参考方案1】:

crontab 命令用法

usage:  crontab [-u user] file
        crontab [-u user] [ -e | -l | -r ]
                (default operation is replace, per 1003.2)
        -e      (edit user's crontab)
        -l      (list user's crontab)
        -r      (delete user's crontab)
        -i      (prompt before deleting user's crontab)

所以,

$output = shell_exec('crontab -l');
file_put_contents('/tmp/crontab.txt', $output.'* * * * * NEW_CRON'.PHP_EOL);
echo exec('crontab /tmp/crontab.txt');

只要用户具有足够的文件写入权限,以上内容即可用于创建和编辑/追加

删除作业:

echo exec('crontab -r');

另外,请注意 apache 以特定用户身份运行,并且通常不是 root,这意味着只能为 apache 用户更改 cron 作业,除非将 crontab -u 权限授予 apache 用户。

【讨论】:

'crontab -r' 不会删除用户的所有作业吗?有什么方法可以删除用户的 crontab 中的特定作业行吗?加载、搜索然后删除找到的行似乎是唯一的方法。 可以使用管道代替写临时文件 不错的解决方案,但shell_exec('crontab -l') 只会返回最后一行。我用exec('crontab -l', $output)。然后将 $output 数组内爆成一个字符串(用 \n 作为胶水)。 @Rahul 如果服务器提供商没有提供像 system()passthru()shell_exec()exec() 这样的 shell 命令,请尝试使用主机附带的控制面板,例如 cPanel或 Plesk。 这将继续每次在文件中附加相同的作业。 (检查)有没有办法先删除匹配的工作然后写一个新的?【参考方案2】:

我们最近准备了一个小型项目 (PHP>=5.3) 来管理私人和个人任务的 cron 文件。此工具连接和管理 cron 文件,以便您可以使用它们,例如每个项目。单元测试可用:-)

命令行示例:

bin/cronman --enable /var/www/myproject/.cronfile --user www-data

API 示例:

use php\manager\crontab\CrontabManager;

$crontab = new CrontabManager();
$crontab->enableOrUpdate('/tmp/my/crontab.txt');
$crontab->save();

从 API 管理单个任务:

use php\manager\crontab\CrontabManager;

$crontab = new CrontabManager();
$job = $crontab->newJob();
$job->on('* * * * *');
$job->onMinute('20-30')->doJob("echo foo");
$crontab->add($job);
$job->onMinute('35-40')->doJob("echo bar");
$crontab->add($job);
$crontab->save();

github:php-crontab-manager

【讨论】:

不错。这肯定会派上用场...假设它确实有效:) @Pacerier 这个项目似乎已经死了并且有一些问题。尝试更活跃的yzalis/crontab。【参考方案3】:

检查 cronjob

function cronjob_exists($command)

    $cronjob_exists=false;

    exec('crontab -l', $crontab);


    if(isset($crontab)&&is_array($crontab))

        $crontab = array_flip($crontab);

        if(isset($crontab[$command]))

            $cronjob_exists=true;

        

    
    return $cronjob_exists;

附加一个 cronjob

function append_cronjob($command)

    if(is_string($command)&&!empty($command)&&cronjob_exists($command)===FALSE)

        //add job to crontab
        exec('echo -e "`crontab -l`\n'.$command.'" | crontab -', $output);


    

    return $output;

删除一个 crontab

exec('crontab -r', $crontab);

示例

exec('crontab -r', $crontab);

append_cronjob('* * * * * curl -s http://localhost/cron/test1.php');

append_cronjob('* * * * * curl -s http://localhost/cron/test2.php');

append_cronjob('* * * * * curl -s http://localhost/cron/test3.php');

【讨论】:

函数 append_cronjob 对我不起作用。我得到输出 '-' 不存在:数组( [0] => '-' 不存在。[1] => 用法:crontab 文件 [2] => crontab [ -e | -l | -r ] [3] => -e (编辑用户的 crontab) [4] => -l (列出用户的 crontab) [5] => -r (删除用户的 crontab) ) exec('echo -e "crontab -l\n'.$command.'" | crontab -', $output);这是正确的吗。我没有得到 www-data "-":0 的 crontab:crontab 文件中的错误分钟错误,无法安装。 Crontab 使用换行符(换行符)分隔作业。每个作业占用一行。因此,如果 crontab 在一行的第一列中看到除整数以外的任何内容,它会抛出“bad minute”错误,因为 minute 参数是 crontab 遇到的第一个参数。看看这个dougv.com/2006/12/… 谢谢...我如何在您的项目中使用 cron_TZ ??【参考方案4】:

应该这样做

shell_exec("crontab -l |  cat; echo '*/1    *    *    *    *    command';  |crontab -");

【讨论】:

【参考方案5】:

我尝试了下面的解决方案

class Crontab 

// In this class, array instead of string would be the standard input / output format.

// Legacy way to add a job:
// $output = shell_exec('(crontab -l; echo "'.$job.'") | crontab -');

static private function stringToArray($jobs = '') 
    $array = explode("\r\n", trim($jobs)); // trim() gets rid of the last \r\n
    foreach ($array as $key => $item) 
        if ($item == '') 
            unset($array[$key]);
        
    
    return $array;


static private function arrayToString($jobs = array()) 
    $string = implode("\r\n", $jobs);
    return $string;


static public function getJobs() 
    $output = shell_exec('crontab -l');
    return self::stringToArray($output);


static public function saveJobs($jobs = array()) 
    $output = shell_exec('echo "'.self::arrayToString($jobs).'" | crontab -');
    return $output; 


static public function doesJobExist($job = '') 
    $jobs = self::getJobs();
    if (in_array($job, $jobs)) 
        return true;
     else 
        return false;
    


static public function addJob($job = '') 
    if (self::doesJobExist($job)) 
        return false;
     else 
        $jobs = self::getJobs();
        $jobs[] = $job;
        return self::saveJobs($jobs);
    


static public function removeJob($job = '') 
    if (self::doesJobExist($job)) 
        $jobs = self::getJobs();
        unset($jobs[array_search($job, $jobs)]);
        return self::saveJobs($jobs);
     else 
        return false;
    

感谢:Crontab Class to Add, Edit and Remove Cron Jobs

【讨论】:

【参考方案6】:

您可以尝试使用ed 之类的内容覆盖EDITOR 环境变量,这可以通过标准输入执行一系列编辑命令。

【讨论】:

【参考方案7】:

取决于您存储 crontab 的位置:

shell_exec('echo "'. $job .'" >> crontab');

【讨论】:

【参考方案8】:

您可以将文件以 cron 格式放入 /etc/cron.d/。为文件名添加一些唯一的前缀 要列出特定于脚本的 cron 作业,只需使用具有唯一前缀的文件列表即可。 当您想禁用作业时删除文件。

【讨论】:

我更喜欢这个解决方案,因为它避免了操作整个 cron 文件,并且很容易删除,而不必在巨大的 cron 文件上添加和删除特定的 cron 任务。【参考方案9】:

不错... 试试这个以删除特定的 cron 作业(已测试)。

<?php $output = shell_exec('crontab -l'); ?>
<?php $cron_file = "/tmp/crontab.txt"; ?>

<!-- Execute script when form is submitted -->
<?php if(isset($_POST['add_cron']))  ?>

<!-- Add new cron job -->
<?php if(!empty($_POST['add_cron']))  ?>
<?php file_put_contents($cron_file, $output.$_POST['add_cron'].PHP_EOL); ?>
<?php  ?>

<!-- Remove cron job -->
<?php if(!empty($_POST['remove_cron']))  ?>
<?php $remove_cron = str_replace($_POST['remove_cron']."\n", "", $output); ?>
<?php file_put_contents($cron_file, $remove_cron.PHP_EOL); ?>
<?php  ?>

<!-- Remove all cron jobs -->
<?php if(isset($_POST['remove_all_cron']))  ?>
<?php echo exec("crontab -r"); ?>
<?php  else  ?>
<?php echo exec("crontab $cron_file"); ?>
<?php  ?>

<!-- Reload page to get updated cron jobs -->
<?php $uri = $_SERVER['REQUEST_URI']; ?>
<?php header("Location: $uri"); ?>
<?php exit; ?>
<?php  ?>

<b>Current Cron Jobs:</b><br>
<?php echo nl2br($output); ?>

<h2>Add or Remove Cron Job</h2>
<form method="post" action="<?php $_SERVER['REQUEST_URI']; ?>">
<b>Add New Cron Job:</b><br>
<input type="text" name="add_cron" size="100" placeholder="e.g.: * * * * * /usr/local/bin/php -q /home/username/public_html/my_cron.php"><br>
<b>Remove Cron Job:</b><br>
<input type="text" name="remove_cron" size="100" placeholder="e.g.: * * * * * /usr/local/bin/php -q /home/username/public_html/my_cron.php"><br>
<input type="checkbox" name="remove_all_cron" value="1"> Remove all cron jobs?<br>
<input type="submit"><br>
</form>

【讨论】:

记得在header('Location: ...');后面加上exit;。另外,这种形式其实很危险,因为它可以添加 cron 作业来“破坏”服务器。 初学者注意:我们实际上并没有将 PHP 的每一行都包含在 PHP 标记中。一个在 PHP 的开头和一个可选的结尾就足够了。【参考方案10】:

最简单的方法是使用 shell_exec 命令执行 bash 脚本,将值作为参数传入。从那里,您可以像在任何其他非交互式脚本中一样操作 crontab,还可以使用 sudo 等确保您拥有正确的权限。

请参阅Crontab without crontab -e,了解更多信息。

【讨论】:

有些人可能在共享主机中,所以这可能根本不起作用。【参考方案11】:

您也可以使用 google 的应用引擎 task queue 代替 crontab。它有大量的免费配额,速度快、可扩展、可修改。

【讨论】:

为什么不简单地使用 cronjob?【参考方案12】:

很简单,你可以 curl 这样做,确保 curl 安装在服务器上:

每分钟触发一次: * * * * * curl --request POST 'https://glassdoor.com/admin/sendBdayNotification'

*

分钟小时日月周

假设您想每天下午 2:15 发送此通知 您可以根据您的 API 更改 POST/GET:

15 14 * * * curl --request POST '你的 API 的 URL'

【讨论】:

以上是关于使用 PHP 创建、编辑和删除 crontab 作业?的主要内容,如果未能解决你的问题,请参考以下文章

linux下使用crontab定时执行脚本

PHP开发APP接口

定时任务

Centos 的计划任务 crontab

linux定时执行php代码-定时计划crontab

Linux定时器工具-crontab 各參数具体解释及怎样查看日志记录