PHPを使用してcrontabジョブを作成、編集、削除しますか?


116

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ジョブリストに追加するにはどうすればよいですか?


2
php
Gordon

14
(ヒント) crontabは単なるファイルです
Gordon

1
@ゴードン、ありがとう。私はすべてがファイルであることを知っていますが、それらは異なるディストリビューションの同じパスにcrontabジョブを格納していますか?さらに、www-dataなどのApacheのユーザーを取得し、rootの権限を持っている必要がありますか?
datasn.io 2010

パスがディストリビューション間で変更されるかどうかはわかりませんが、パスをコード内で構成可能な値にして、実行時に設定することでうまくいきます。ユーザーと権限について:すべてのユーザーは、そのユーザーに割り当てられた権限でジョブを実行するcrontabを持つことができるため、これはシステム設定に固有です。
ゴードン

回答:


133

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ユーザーにcrontab -u特権を与えない限り、Acronisユーザーに対してのみcronジョブを変更できます。


4
「crontab -r」はユーザーのすべてのジョブを削除しませんか?ユーザーのcrontabでジョブの特定の行を削除する方法はありますか?見つかった行の読み込み、検索、削除が唯一の方法のようです。
datasn.io 2010

3
一時ファイルを作成する代わりにパイプを使用できます
realmfoo

7
素晴らしい解決策ですがshell_exec('crontab -l')、最後の行のみを返します。使用しましたexec('crontab -l', $output)。次に、$ output配列を文字列に分解します(\ nを接着剤として使用)。
デビッドフェアバンクス

1
@Rahulサーバープロバイダのようなシェルコマンドを提供しなかった場合はsystem()passthru()shell_exec()およびexec()、そのようなcPanelのまたはPleskのように、ホスティングに付属しているコントロールパネルを使用してみてください。
ラプター2014

3
これにより、ファイルに毎回同じジョブが追加され続けます。(チェック)最初に一致するジョブを削除してから新しいジョブを書き込む方法はありますか?
RT

20

私たちは最近、プライベートタスクと個別タスクのcronファイルを管理するミニプロジェクト(PHP> = 5.3)を準備しました。このツールは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


いいね。これは確かに役に立ちます...実際に機能すると仮定します:)
Baraka

@Pacerierこのプロジェクトは死んでいるようで、いくつかの問題があります。よりアクティブなyzalis / crontabを試してください。
Jeff Puckett 2016年

10

cronジョブを確認する

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

cronジョブを追加する

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が機能しません。'-' does not exist:Array([0] => '-' does not exist。[1] => usage:crontab file [2] => crontab [-e | -l | -r] [3] => -e(ユーザーのcrontabを編集)[4] => -l(ユーザーのcrontabをリスト)[5] => -r(ユーザーのcrontabを削除))
user1307016

exec( 'echo -e " crontab -l\ n'。$ command。 '" | crontab-'、$ output); それが正しいか。www-data "-":0のcrontabが表示されません。crontabファイルに不正な分のエラーがあり、インストールできません。
Rahul Tailwal、2015年

Crontabは、ジョブを改行(改行)で区切ります。各ジョブは1行を占めます。したがって、crontabが行の最初の列に整数以外のものを見つけると、分引数がcrontabで最初に発生するため、「悪い分」エラーをスローします。このチェックアウトdougv.com/2006/12/...
RafaSashi

おかげで...あなたのプロジェクトを使用してcron_TZをどのように使用できますか?
セーラムアーメド2017年

5

これでうまくいくはずです

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

}

credits to:cronジョブを追加、編集、削除するCrontabクラス


4

EDITOR環境変数をed、標準入力を介して一連の編集コマンドを取得できるようなものでオーバーライドしてみることができます。


3

crontabを保存する場所によって異なります。

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

3

ファイルを/etc/cron.d/にcron形式で配置できます。filenanameに一意のプレフィックスを追加するスクリプト固有のcronジョブを一覧表示するには、一意のプレフィックスを持つファイルのリストを操作するだけです。ジョブを無効にする場合は、ファイルを削除します。


巨大なcronファイルで特定のcronタスクを追加および削除する必要があるのに対し、cronファイル全体を操作する必要がなく、削除が簡単なので、このソリューションの方が好きです。
Jovanni G 2018

3

いいですね...
これを試して、特定の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>

exit;後に追加することを忘れないでくださいheader('Location: ...');。また、このフォームはcronジョブを追加してサーバーを「破壊」する可能性があるため、実際には非常に危険です。
ラプター2014

1
初心者への注意:実際には、PHPのすべての行をPHPタグで囲むわけではありません。PHPの最初に1つ、オプションで最後に1つで十分です。
ekerner、2015年

0

最も簡単な方法は、shell_execコマンドを使用してbashスクリプトを実行し、値をパラメーターとして渡すことです。そこから、他の非インタラクティブスクリプトと同じようにcrontabを操作し、sudoなどを使用して適切な権限を持っていることを確認できます。

詳しくは、crontab -eを使用しないCrontabを参照してください。


一部の人は共有ホストにいる可能性があるため、まったく機能しない可能性があります。
TheRealChx101 2017年


-1

そのシンプルな方法でカールさせることができます。サーバーにカールがインストールされていることを確認してください。

毎分トリガーする場合:* * * * * curl --request POST ' https://glassdoor.com/admin/sendBdayNotification '

        • *

    分時日月週

この通知を毎日午後2時15分に送信する とします。APIに基づいてPOST / GETを変更できます。

15 14 * * * curl --request POST 'url of ur API'

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.