문제

I have a cronjob that get's updated when a (administrative) user sets a date. The cronjob is set correctly, because it shows like this in the cronjob list (on cPanel):

lynx -source http://www.example.com/dynam_code/autoscripts/expenseClaims.php?do=notify&date=1350252000&final=1350338400

This is the cronjob creation script:

$output = shell_exec('crontab -l');
$jobs = explode(PHP_EOL,$output);
$minute = '00';
$hour = '09';
$day = date('j',strtotime($_GET['reminder']));
$month = date('n',strtotime($_GET['reminder']));

for($i = 0; $i < count($jobs); $i++) {
    if(strpos($jobs[$i],'http://intra.vceza.com/dynam_code/autoscripts/expenseClaims.php?do=notify') !== false)
        $jobs[$i] = $minute.' '.$hour.' '.$day.' '.$month.' * lynx -source http://intra.vceza.com/dynam_code/autoscripts/expenseClaims.php?do=notify&date='.strtotime($_GET['done']).'&final='.strtotime($_GET['approved']);
    }
    foreach($jobs as $key => $value) { 
        if($value == "") { 
            unset($jobs[$key]); 
        } 
    } 
    $jobs = array_values($jobs); 

    $jobs[] = "";
    $output = implode(PHP_EOL,$jobs);
    file_put_contents('/tmp/crontab.txt', $output);
    exec('crontab /tmp/crontab.txt',$output,$return);

This cronjob triggers a mailing script that sends a mail to the whole company based on those dates. When the script runs automatically, it shows all the dates as 1 January 1970. But, when I copy the path to that PHP file from the cron job and run it, it sends out the correct dates.

Here is the script that grabs the date and sends the mail:

if($_GET['do'] == 'notify') {
    $time = $_GET['date'];
    $day = date('l',$time);
    $date = date('j F Y',$time);
    $final = date('j F Y',$_GET['final']);
    $to = 'people@example.com';
    $str = "Expense Claims";

    $html_data = '<html><head><title>'.$str.'</title></head><body style="font-family:Calibri, Arial; font-size:15px">Good day all,<br/><br/>Please take note that all Expense Claim should be completed on the intraweb by ' . $day . ' morning <b>' . $date . ' before 9am.</b><br/><br/>All supervisors should approve claims by Friday morning <b>' . $final . ' before 9am.</b> <br/><br/>All slips and supporting documents should be handed in by Friday morning <b>' . $final . ' before 9am</b>. Bear in mind that it is the sole responsibility of the claimee to hand in his/her slips or supporting documents.<br/><br/><span style="color:red">Please take note that Expense Claims will only reach the Finance Department if <b>submitted and approved on time.</b> Claims not submitted or approved on time will only be processed in the following month.</span><br /><br/>Kind regards,<br/>JD</body></html>';

    $mime = new MIME_mail("John Doe <jd@example.com>", $to, $str);
    $mime->fattach($path,"",OCTET,BASE64,ATTACH);
    $mime->attach($html_data,$str, HTML, BASE64);
    $mime->send_mail();
}

I have no idea what the issue is, I've tried looking through the code. Like I said, if I run it manually it works. If the cronjob runs it, it doesn't.

도움이 되었습니까?

해결책

Your crontab entry contains a '&' after do=notify. If you use a '&' in a command in a cron job (or a *nix shell for that matter), it means that the part before the & will be executed in the background. Therefore, only the 'lynx -source http://www.example.com/dynam_code/autoscripts/expenseClaims.php?do=notify' part is executed. You need to quote the url, so the command will look like this:

lynx -source 'http://www.example.com/dynam_code/autoscripts/expenseClaims.php?do=notify&date=1350252000&final=1350338400'
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top