복붙노트

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

PHP

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

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

아파치 사용자의 현재 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 작업 목록에 어떻게 추가합니까?

해결법

  1. ==============================

    1.crontab 명령 사용법

    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 권한이 부여되지 않으면 cron 작업이 apache 사용자에 대해서만 변경 될 수 있음을 유의하십시오.

  2. ==============================

    2.우리는 최근 개인 프로젝트와 개인 작업을위한 cron 파일을 관리하기위한 미니 프로젝트 (PHP> = 5.3)를 준비했습니다. 이 도구는 cron 파일을 연결하고 관리하므로 프로젝트 당 사용할 수 있습니다. 단위 테스트 가능 :-)

    우리는 최근 개인 프로젝트와 개인 작업을위한 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

  3. ==============================

    3.cronjob 확인

    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');
    
  4. ==============================

    4.EDITOR 환경 변수를 표준 입력에 비해 일련의 편집 명령을 취할 수있는 ed와 같은 것으로 대체 할 수 있습니다.

    EDITOR 환경 변수를 표준 입력에 비해 일련의 편집 명령을 취할 수있는 ed와 같은 것으로 대체 할 수 있습니다.

  5. ==============================

    5.이게해야 해.

    이게해야 해.

    shell_exec("crontab -l | { cat; echo '*/1    *    *    *    *    command'; } |crontab -");
    
  6. ==============================

    6.좋은... 특정 크론 작업 (테스트 됨)을 제거하려면이 방법을 사용하십시오.

    좋은... 특정 크론 작업 (테스트 됨)을 제거하려면이 방법을 사용하십시오.

    <?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>
    
  7. ==============================

    7.crontab을 저장하는 위치에 따라 달라집니다.

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

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

    8.파일을 /etc/cron.d/에 cron 형식으로 저장할 수 있습니다. 파일 이름에 몇 가지 고유 한 접두어 추가 스크립트 별 cron 작업을 나열하려면 고유 한 접두사가있는 파일 목록을 사용하십시오. 작업을 사용하지 않으려면 파일을 삭제하십시오.

    파일을 /etc/cron.d/에 cron 형식으로 저장할 수 있습니다. 파일 이름에 몇 가지 고유 한 접두어 추가 스크립트 별 cron 작업을 나열하려면 고유 한 접두사가있는 파일 목록을 사용하십시오. 작업을 사용하지 않으려면 파일을 삭제하십시오.

  9. ==============================

    9.나는 아래의 해결책을 시도했다.

    나는 아래의 해결책을 시도했다.

    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 클래스는 Cron 작업을 추가, 편집 및 제거합니다

  10. ==============================

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

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

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

  11. ==============================

    11.그것의 간단한 당신은 그렇게 할 수 컬, 서버에 설치된 컬을 확인하십시오 :

    그것의 간단한 당신은 그렇게 할 수 컬, 서버에 설치된 컬을 확인하십시오 :

    매분마다 트리거 :  * * * * * curl --request POST 'https://glassdoor.com/admin/sendBdayNotification'

    이 알림을 매일 오후 2:15에 보내려고합니다. API를 기반으로 POST / GET을 변경할 수 있습니다.

    15 14 * * * curl --request POST의 'API url'

  12. ==============================

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

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

  13. from https://stackoverflow.com/questions/4421020/use-php-to-create-edit-and-delete-crontab-jobs by cc-by-sa and MIT license