简体   繁体   中英

Running a cron job. All my tests and tries were in vane

This is the first time I run a cron job. I'm doing it in a virtual machine with Amazon, Ubuntu 14.04.2 LTS.

This is the file of my crontab -e :

# Edit this file to introduce tasks to be run by cron.
# 
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
# 
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').# 
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
# 
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
# 
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command
*/1 * * * * root /usr/bin/php /var/www/html/testimages/script.php

Well, this is what I've tried so far, I'm making a list so whoever could have a problem with cron jobs, could check what to do before:

  • Modifying either ubuntu user's crontab and root user's crontab.
  • Leave a blank line at the end
  • * * * * * root /usr/bin/php /var/www/html/testimages/script.php
  • * * * * * ubuntu /usr/bin/php /var/www/html/testimages/script.php
  • * * * * * /usr/bin/php /var/www/html/testimages/script.php
  • * * * * * php /var/www/html/testimages/script.php
  • * * * * * "php /var/www/html/testimages/script.php"
  • All this, but replacing the first * by */1
  • Setting permission to 755 to script.php
  • Restarting cron
  • Adding a header line on script.php of this: #!/usr/local/bin/php -q

When I type grep CRON /var/log/syslog I can see:

Oct 27 15:32:01 ip-172-31-1-104 CRON[1184]: (root) CMD (root /usr/bin/php /var/www/html/testimages/script.php)

Oct 27 15:33:01 ip-172-31-1-104 CRON[1520]: (root) CMD (root /usr/bin/php /var/www/html/testimages/script.php)

Oct 27 15:34:01 ip-172-31-1-104 CRON[1849]: (root) CMD (root /usr/bin/php /var/www/html/testimages/script.php)

Oct 27 15:35:01 ip-172-31-1-104 CRON[2188]: (root) CMD (root /usr/bin/php /var/www/html/testimages/script.php)

Oct 27 15:36:01 ip-172-31-1-104 CRON[2513]: (root) CMD (root /usr/bin/php /var/www/html/testimages/script.php)

Oct 27 15:37:01 ip-172-31-1-104 CRON[2840]: (root) CMD (root /usr/bin/php /var/www/html/testimages/script.php)

Oct 27 15:38:01 ip-172-31-1-104 CRON[3165]: (root) CMD (root /usr/bin/php /var/www/html/testimages/script.php)

Oct 27 15:39:01 ip-172-31-1-104 CRON[3494]: (root) CMD (root /usr/bin/php /var/www/html/testimages/script.php)

the script basically executes the code and sends an email, which does perfectly when I type php /var/www/html/testimages/script.php on the command line, but I'm not getting that mail when set in cron.

What am I doing wrong?

Thank you very much.

Regards.

Rafael.


EDIT :

this is the php file I'm trying to run

#!/usr/local/bin/php -q
<?php
    echo '<script>!function(e){function t(e,t){var n=new Image,r=e.getAttribute("data-src");n.onload=function(){e.parent?e.parent.replaceChild(n,e):e.src=r,t?t():null},n.src=r}function n(t){var n=t.getBoundingClientRect();return n.top>=0&&n.left>=0&&n.top<=(e.innerHeight||document.documentElement.clientHeight)}for(var r=function(e,t){if(document.querySelectorAll)t=document.querySelectorAll(e);else{var n=document,r=n.styleSheets[0]||n.createStyleSheet();r.addRule(e,"f:b");for(var l=n.all,c=0,o=[],i=l.length;i>c;c++)l[c].currentStyle.f&&o.push(l[c]);r.removeRule(0),t=o}return t},l=function(t,n){e.addEventListener?this.addEventListener(t,n,!1):e.attachEvent?this.attachEvent("on"+t,n):this["on"+t]=n},c=new Array,o=r("img.lazy"),i=function(){for(var e=0;e<c.length;e++)n(c[e])&&t(c[e],function(){c.splice(e,e)})},u=0;u<o.length;u++)c.push(o[u]);i(),l("scroll",i)}(this);</script>'
    
    echo '<style>table, th, td {border: 1px solid black;    border-collapse: collapse;}th, td {padding: 15px;}th {    text-align: left;    background-color: #666666;}</style>';
    
    require '/var/www/html/libraries/mail/PHPMailerAutoload.php';
    require '/var/www/html/libraries/myLibrary/core.php';
    $mail = new PHPMailer;
    
    
    $to = "example@gmail.com";

    ob_start();
    
    function echoText($text) {
        echo $text;
    }
    
    $show_json = $_GET['show_json'];
    
    echoContent(); // belongs to the core
        
        
    // send email
    
    $mail->isSMTP();                                      // Set mailer to use SMTP
    $mail->Host = 'smtp.gmail.com';  // Specify main and backup SMTP servers
    $mail->SMTPAuth = true;                               // Enable SMTP authentication
    $mail->Username = 'example@gmail.com';                 // SMTP username
    $mail->Password = 'secret';                           // SMTP password
    $mail->SMTPSecure = 'tls';                            // Enable TLS encryption, `ssl` also accepted
    $mail->Port = 587;                                    // TCP port to connect to
    
    $mail->setFrom('example@gmail.com', 'Watchdog - Rafael');
//        $mail->addAddress('joe@example.net', 'Joe User');     // Add a recipient
    $mail->addAddress($to);

//        $mail->addReplyTo('info@example.com', 'Information');

//        $mail->addBCC('bcc@example.com');
    
//        $mail->addAttachment('/var/tmp/file.tar.gz');         // Add attachments
//        $mail->addAttachment('/tmp/image.jpg', 'new.jpg');    // Optional name
    $mail->isHTML(true);                                  // Set email format to HTML
    
    $mail->Subject = 'Test on database';
    $contents = ob_get_contents();
    $mail->Body    = $contents;
    
    
//        $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
    
    if(!$mail->send()) {
        echo 'Message could not be sent.';
        echo 'Mailer Error: ' . $mail->ErrorInfo;
    } else {
        echo 'Message has been sent';
    }
    print_r(error_get_last());
    
}
    
?>

EDIT: I'm trying to set a bash script to run it, and export even the results to a log.txt... that log.txt is empty.

Your issues is on line 1 of your php script - missing a terminating ;

The CRON syslogs you posted show cron running the script. The emails you were receiving were most likely FROM CRON and not your script. Unfortunate co-incidence your script's job is to send emails, however, you script does not send to local user "ubuntu".

If you were to read those mails (and you should!), you would probably see the fault.

The script either has a bug or it doesnt, and was either run or wasnt. Depending on your config of your php(-cli).ini, its quite plausible you were not getting any Error reporting, thus leading you to assume the script was OK. Syntax is syntax.

There is no such thing as a "minimal error". If you get away with it, we call it a "feature" ;)

I discovered that the system was sending me mails like:

You've got a new mail on /var/mail/ubuntu

I was ignoring them since I was able to execute the script on the command line so I thought there weren't any errors. But they were (a ; )... so the command line executes the script but not the cron if there's a minimal error. That's what it was.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM