PHP를 사용하여 crontab 작업을 생성, 편집 및 삭제 하시겠습니까?


116

PHP를 사용하여 crontab 작업을 생성, 편집 및 삭제할 수 있습니까?

Apache 사용자의 현재 crontab 작업을 나열하는 방법을 알고 있습니다.

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

하지만 PHP로 크론 작업을 추가하는 방법은 무엇입니까? 'crontab -e'는 텍스트 편집기를 열기 만하면 파일을 저장하기 전에 항목을 수동으로 편집해야합니다.

그리고 PHP로 크론 작업을 삭제하는 방법은 무엇입니까? 다시 한번 'crontab -e'로 수동으로해야합니다.

다음과 같은 작업 문자열을 사용합니다.

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

PHP로 crontab 작업 목록에 어떻게 추가합니까?



14
(힌트) 은 crontab 단지이다 파일
고든

1
@Gordon, 감사합니다. 나는 모든 것이 파일이라는 것을 알고 있지만 다른 배포판에서 동일한 경로에 crontab 작업을 저장하고 있습니까? 또한 www-data와 같은 Apache 사용자를 가져와 루트 권한이 있어야합니까?
datasn.io 2010

경로가 배포판에서 변경되는지 확실하지 않지만 코드에서 경로를 구성 가능한 값으로 만들고 런타임에 설정하는 것이 좋습니다. 사용자 및 권한 : 모든 사용자는 해당 사용자에게 할당 된 권한으로 작업을 실행하는 crontab을 가질 수 있으므로 이는 시스템 설정에 대해 개별적입니다.
Gordon

답변:


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');

또한 아파치가 특정 사용자로 실행되고 있으며 일반적으로 루트가 아닙니다. 즉, 아파치 사용자에게 crontab -u권한이 부여되지 않는 한 아파치 사용자에 대해서만 크론 작업을 변경할 수 있습니다 .


4
'crontab -r'이 사용자의 모든 작업을 삭제하지 않습니까? 사용자의 crontab에서 특정 작업 라인을 삭제할 수있는 방법이 있습니까? 찾은 줄을로드, 검색 및 삭제하는 것이 유일한 방법 인 것 같습니다.
datasn.io 2010

3
임시 파일을 작성하는 대신 파이프를 사용할 수 있습니다
realmfoo

7
좋은 솔루션이지만 shell_exec('crontab -l')마지막 줄만 반환합니다. 나는 exec('crontab -l', $output). 그런 다음 $ output 배열을 문자열로 내파합니다 (\ n을 접착제로 사용).
David Fairbanks

1
@Rahul 서버 제공 업체는 같은 쉘 명령을 제공하지 않은 경우 system(), passthru(), shell_exec()exec()등의 cPanel이나 Plesk를 같은 호스팅와 함께 제공되는 컨트롤 패널을 사용해보십시오.
Raptor

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


좋은. 이것은 확실히 실제로 가정 할 :) 작동 ... 편리합니다
바라카

@Pacerier이 프로젝트는 죽은 것 같고 몇 가지 문제가 있습니다. 더 활동적인 yzalis / crontab 을 사용해보십시오 .
Jeff Puckett 2016

10

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 함수가 작동하지 않습니다. 출력 '-'가 존재하지 않습니다 : Array ([0] => '-'가 존재하지 않습니다. [1] => 사용법 : crontab 파일 [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

Crontab은 줄 바꿈 (줄 바꿈)으로 작업을 구분합니다. 각 작업은 한 줄을 차지합니다. 따라서 crontab이 행의 첫 번째 열에서 정수 이외의 항목을 발견하면 분 인수가 crontab이 처음으로 발견 한 것이므로 "불량 분"오류가 발생합니다. dougv.com/2006/12/를
RafaSashi

고마워요 ... 프로젝트를 사용하여 cron_TZ를 어떻게 사용할 수 있습니까?
Salem Ahmed

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

}

크레딧 : Cron 작업을 추가, 편집 및 제거하는 Crontab 클래스


4

표준 입력을 통해 일련의 편집 명령을 사용할 수 EDITOR있는 것과 같은 ed것으로 환경 변수를 재정의 할 수 있습니다.


3

crontab을 저장하는 위치에 따라 다릅니다.

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

3

파일을 cron 형식으로 /etc/cron.d/에 넣을 수 있습니다. filenaname에 몇 가지 고유 한 접두사 추가 스크립트 별 cron 작업을 나열하려면 고유 한 접두사가있는 파일 목록으로 작업하면됩니다. 작업을 비활성화하려면 파일을 삭제하십시오.


이 솔루션은 전체 cron 파일을 조작하는 것을 피하고 거대한 cron 파일에서 특정 cron 작업을 추가 및 제거하는 것보다 제거하기 쉽기 때문에 더 좋습니다.
Jovanni G

3

니스 ...
특정 크론 작업을 제거하려면이 작업을 시도하십시오 (테스트 됨).

<?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: ...');. 또한이 형식은 서버를 "파괴"하기 위해 크론 작업을 추가 할 수 있으므로 실제로 매우 위험합니다.
Raptor

1
초보자를위한 참고 사항 : 실제로 모든 PHP 줄을 PHP 태그로 감싸지는 않습니다. PHP 시작 부분에 하나, 선택적으로 끝 부분에 하나씩 충분합니다.
ekerner 2015-06-03

0

가장 쉬운 방법은 shell_exec 명령을 사용하여 bash 스크립트를 실행하고 값을 매개 변수로 전달하는 것입니다. 거기에서 다른 비대화 형 스크립트 에서처럼 crontab을 조작 할 수 있으며 sudo 등을 사용하여 올바른 권한이 있는지 확인할 수도 있습니다.

자세한 내용은 crontab -e없는 Crontab을 참조하십시오 .


일부 사람들은 공유 호스트에있을 수 있으므로 전혀 작동하지 않을 수 있습니다.
TheRealChx101

-1

crontab 대신 Google의 앱 엔진 작업 대기열을 사용할 수도 있습니다 . 넉넉한 무료 할당량이 있으며 빠르고 확장 가능하며 수정할 수 있습니다.


3
단순히 cronjob을 사용하지 않는 이유는 무엇입니까?
Pacerier

-1

그것의 간단합니다 당신은 그렇게 할 수 있습니다, curl이 서버에 설치되어 있는지 확인하십시오 :

매분 트리거 : * * * * * 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.