Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP创建、编辑和删除crontab作业?_Php_Crontab - Fatal编程技术网

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

使用PHP创建、编辑和删除crontab作业?,php,crontab,Php,Crontab,是否可以使用PHP创建、编辑和删除crontab作业 我知道如何列出Apache用户当前的crontab作业: $output = shell_exec('crontab -l'); echo $output; 但是如何用PHP添加cron作业?”crontab-e'只需打开一个文本编辑器,您必须在保存文件之前手动编辑条目 以及如何使用PHP删除cron作业?同样,您必须通过“crontab-e”手动执行此操作 使用如下作业字符串: $job = '0 */2 * * * /usr/bin/p

是否可以使用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作业列表?

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


有关更多信息,请参见此部分。

您可以尝试使用类似ed的内容覆盖编辑器环境变量,它可以在标准输入上执行一系列编辑命令。

取决于您存储crontab的位置:

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

除了crontab,你还可以使用谷歌的应用引擎。它有一个慷慨的免费配额,快速、可扩展、可修改。

crontab命令用法

所以

如果用户具有足够的文件写入权限,则上述内容可用于创建和编辑/追加

要删除作业,请执行以下操作:


另外,请注意,apache是以特定用户的身份运行的,并且通常不是root用户,这意味着只有在向apache用户授予crontab-u权限的情况下,才能为apache用户更改cron作业。

您可以将文件以cron格式放入/etc/cron.d/。向filenaname添加一些唯一的前缀 要列出特定于脚本的cron作业,只需使用具有唯一前缀的文件列表。
如果要禁用作业,请删除该文件。

我们最近准备了一个小型项目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();
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();
从API管理单个任务:

use php\manager\crontab\CrontabManager;

$crontab = new CrontabManager();
$crontab->enableOrUpdate('/tmp/my/crontab.txt');
$crontab->save();
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:

这应该可以

shell_exec("crontab -l | { cat; echo '*/1    *    *    *    *    command'; } |crontab -");
很好。。。 尝试此操作以删除已测试的特定cron作业

检查工作

附加cronjob

删除crontab

范例


我尝试了下面的解决方案

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;
    }
}
}


归功于:

很简单,您可以使用curl来执行此操作,请确保服务器上安装了curl:

每分钟触发一次: *****卷曲-请求张贴

* 分时日月周

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


15 14***curl-请求发布“ur API的url”

可能与crontab重复,并提示crontab只是一个file@Gordon谢谢我知道所有内容都是一个文件,但它们是否在不同发行版的同一路径上存储crontab作业?此外,它还需要获得Apache的用户(如www数据)并具有root权限?我不确定路径是否会在发行版之间发生变化,但您可以在代码中将路径设置为可配置值,然后在运行时进行设置。关于用户和权限:每个用户都可以有一个crontab,该crontab运行分配给该用户的权限的作业,因此这对于您的系统设置是单独的。另请参见“crontab-r”是否会删除该用户的所有作业?是否有任何方法可以删除用户crontab中的特定作业行?加载、搜索然后删除找到的行似乎是唯一的方法。您可以使用管道而不是编写临时fileNice解决方案,但是shell_exec'crontab-l'将只返回最后一行。我使用了exec'crontab-l',$output。然后将$output数组内爆为一个字符串,\n作为粘合剂。@Rahul如果服务器提供程序没有提供诸如system、PASSTRU、shell_exec和exec之类的shell命令,请尝试使用主机附带的控制面板,如cPanel或Plesk。这样每次都会在文件中追加相同的作业。检查是否有办法先删除匹配的作业,然后再编写新作业?很好。这肯定会派上用场的。。。假设它真的有效:@Pacerier这个项目似乎已经死了,并且有一些问题。尝试哪个更活跃。记住添加退出;在标题“位置:…”之后;。另外,这个表单实际上相当危险,因为它可以添加cron作业来破坏服务器。一个在PHP开头,一个在结尾就足够了。函数append\u cronjob对我不起作用。我得到的输出'-'不存在:数组[0]=>'-'不存在。[1] =>用法:crontab文件[2]=>crontab[-e |-l |-r][3]=>-e编辑用户的crontab[4]=>-l列出用户的crontab[5]=>-r删除用户的crontab执行命令'echo-e crontab-l\n'。.| crontab-',$output;对吗。我没有收到www数据的crontab-:0:crontab文件中存在错误分钟,
无法安装。Crontab使用换行符和换行符分隔作业。每个作业占用一行。因此,如果crontab在一行的第一列中看到除整数以外的任何内容,它将抛出“bad minute”错误,因为minute参数是crontab遇到的第一个参数。看看这个谢谢。。。如何在您的项目中使用cron_TZ?为什么不简单地使用cronjob?有些人可能在共享主机中,因此这可能根本不起作用。我更喜欢此解决方案,因为它避免了对整个cron文件的操作,并且易于删除,而不必在大型cron文件上添加和删除特定的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>
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;
}
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;
}
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');
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;
    }
}