Solved

cron job says it ran, no results

Posted on 2016-08-25
25
118 Views
Last Modified: 2016-08-29
Linux server. I have tried everything to get a cron job to produce results but no go.  My web host says they can look in the cron log and see that it ran, no errors. I can run the exact same script via a browser and it works fine. It's just trying to run a php script. My web host says everything looks ok, crontab.txt is in order, must be the script. I do run crontab crontab.txt via SSH each time I alter the file. No results. But again, I can run it via browser no problem. What other variables could there be?
0
Comment
Question by:QMBB
25 Comments
 
LVL 83

Expert Comment

by:Dave Baldwin
ID: 41771018
User permissions is the first thing.  Running thru the web server, the path can simply be relative to the web root and it runs under the web server permissions.  Running from the command line or crontab, the path must be a complete operating system path to the PHP file.
1
 

Author Comment

by:QMBB
ID: 41771022
It is, according to all my research of existing cron jobs that ARE working and according to the webhost. It's:

40 1 * * * /usr/local/bin/php /usr/www/users/myuser/myfolder/anotherfolder/script/SubmitFeed.php
0
 
LVL 109

Expert Comment

by:Ray Paseur
ID: 41771039
Try this one.  See if you get the email.
<?php // demo/cron_example_phpinfo.php
/**
 * This script can be run as a regular web page and as a cron job.
 * It sends an email -- insert your email address in the last line.
 * You can see the differences between the two php environments.
 */
error_reporting(E_ALL);


// START THE OUTPUT BUFFER TO CAPTURE THE STDOUT STRING
ob_start();

// PRINT THE PHP ENVIRONMENTAL DATA
phpinfo();

// COPY THE OUTPUT BUFFER
$info = ob_get_clean();

// EMAIL IT TO YOURSELF - SET YOUR OWN EMAIL ADDRESS HERE
mail('You@Your.org', 'CRON INFO', $info);

Open in new window

0
Master Your Team's Linux and Cloud Stack

Come see why top tech companies like Mailchimp and Media Temple use Linux Academy to build their employee training programs.

 

Author Comment

by:QMBB
ID: 41771046
Worked in browser, testing via cron...
1
 
LVL 77

Expert Comment

by:arnold
ID: 41771052
What is it supposed to do?



Make sure you use full paths to system calls within the php.

You have it setup to run at 1:40 am server time.

If there is any output from the script an email to the user under whose credentials the cron job will receive notification. Adding a .forward with your email address so any output from the cron will get to you......
0
 
LVL 109

Expert Comment

by:Ray Paseur
ID: 41771053
This may be a red herring, but I'll mention it anyway.  Email pipes and Cron jobs that create browser output can be "confusing" for some operating systems.  Since there is no HTTP request that starts the process, there is no logical place to send the server response.  You might consider adding ob_end_clean() as the last line of the PHP script.
0
 

Author Comment

by:QMBB
ID: 41771059
Ray,

That worked! I got the email when it ran via cron. So what does that say about my original script? MAYBE it's the fact that there are caps in the file name? Just realized that's the only thing I haven't changed. Trying that now...
0
 
LVL 109

Expert Comment

by:Ray Paseur
ID: 41771063
Could be!  

Some file systems are case-sensitive, some are not.  I try to treat all development and deployment environments as if they were case-sensitive (even though I know that PHP allows case-insensitive class and function names).  It's just a more "foolproof" approach.
0
 

Author Comment

by:QMBB
ID: 41771069
Nope. Case made no diff. Wth?
0
 
LVL 109

Expert Comment

by:Ray Paseur
ID: 41771096
So what does that say about my original script?
Don't know; haven't seen the original script.  Maybe strip it down to the SSCCE and start building it back up step-wise so you can see which of the steps causes the failure?  That's what I would do.
0
 

Author Comment

by:QMBB
ID: 41771107
Doing that now, testing. Will report back tomorrow. Thanks for the help thus far.
0
 
LVL 34

Expert Comment

by:gr8gonzo
ID: 41771113
My guess is that you have a problem within your original script. Maybe you're trying to use or rely on environmental variables that don't exist when the script is run from the command line. For example, when you run a script via the browser, you'll get variables like $_SERVER["REMOTE_ADDR"] and $_SERVER["HTTP_USER_AGENT"] but those will either not exist or be empty when run via cron. There are a handful of others, as well.

Your best bet is to attach your script (sanitized so that all usernames/passwords/domains/sensitive info is removed) for review.
1
 

Author Comment

by:QMBB
ID: 41771116
Tested again after cleaning, no go. Cleaned version attached.
script.txt
0
 
LVL 9

Expert Comment

by:Brian Tao
ID: 41771164
You're basically doing a bunch of "echo" function calls in the script.
Of course it works in browser and not in a cron job.  There's no place for the PHP to echo to.
0
 
LVL 109

Expert Comment

by:Ray Paseur
ID: 41771377
From the look of this code, it appears that you may be new to PHP.  If you want to learn the language, this article can help you get a foundation.  You can probably skip over parts of the background and basics, but at least it will point you to well-vetted trustworthy learning resources.

The "echo" statements are useless in a script that does not have browser output, but their output (which would otherwise go to a browser) can be captured via output buffering.  Please see the earlier comment about this.  The information from the echo statements may be useful for debugging.  Please see the script posted below.

The file paths may need to be fully qualified.  What works relative to the WWW root directory is not likely to work relative to the CRON root directory!  Please see the earlier comment about this.  Check "feed.txt" with var_dump() to see if you're getting what you think.

The PHP error control operator is a bad idea.  Read the man page, so you understand why you do not want to use it.  Instead, figure out what is causing the error messages and fix the root cause.  Remove the @-signs.  No more @-signs in your code, ever!  The error suppression could have been masking your problems all along, but there would be no way to know.

Suggest you try the script like this.  Check the comments carefully so you know what changed!  Put your own email address in the appropriate place near line 50.  When this runs, it will email its output to you, just like the other script did.  Then you can see what it did, what messages were produced, etc.  That should help you get started with the debugging process.  

Sidebar note: PHP echo is not a function -- it's a language construct.  You don't need the parentheses, so save yourself some typing :-)

Best regards, and best of luck, ~Ray
<?php
ob_start(); // COLLECT THE "BROWSER" OUTPUT
ini_set('display_errors', TRUE); // GET "BROWSER" OUTPUT FOR ERROR DISPLAY
error_reporting(E_ALL); // RAISE ERROR REPORTING LEVEL TO HIGHEST

include_once ('.config.inc.php'); 

$serviceUrl = "https://mws.amazonservices.com";

$config = array (
  'ServiceURL' => $serviceUrl,
  'ProxyHost' => null,
  'ProxyPort' => -1,
  'MaxErrorRetry' => 3,
);

 $service = new MarketplaceWebService_Client(
     AWS_ACCESS_KEY_ID, 
     AWS_SECRET_ACCESS_KEY, 
     $config,
     APPLICATION_NAME,
     APPLICATION_VERSION);

$feed = file_get_contents("feed.txt"); // IS THIS FILE PATH CORRECT?
var_dump($feed); // SEE IF WE GOT WHAT WE WANTED FROM "feed.txt"

$marketplaceIdArray = array("Id" => array('ABCD1234ETC'));

$feedHandle = fopen('php://memory', 'rw+'); // REMOVED ERROR CRONTROL OPERATOR
fwrite($feedHandle, $feed);
rewind($feedHandle);

$request = new MarketplaceWebService_Model_SubmitFeedRequest();
$request->setMerchant(MERCHANT_ID);
$request->setMarketplaceIdList($marketplaceIdArray);
$request->setFeedType('_POST_FLAT_FILE_LISTINGS_DATA_');
$request->setContentMd5(base64_encode(md5(stream_get_contents($feedHandle), true)));
rewind($feedHandle);
$request->setPurgeAndReplace(false);
$request->setFeedContent($feedHandle);
$request->setMWSAuthToken('<MWS Auth Token>'); // Optional

rewind($feedHandle);

invokeSubmitFeed($service, $request);

fclose($feedHandle); // REMOVED ERROR CRONTROL OPERATOR

$info = ob_get_clean(); // COPY THE OUTPUT BUFFER
mail('You@Your.org', 'SCRIPT INFO', $info); // EMAIL IT TO YOURSELF - SET YOUR OWN EMAIL ADDRESS HERE


  function invokeSubmitFeed(MarketplaceWebService_Interface $service, $request) 
  {
      try {
              $response = $service->submitFeed($request);
              
                echo ("Service Response\n");
                echo ("=============================================================================\n");

                echo("        SubmitFeedResponse\n");
                if ($response->isSetSubmitFeedResult()) { 
                    echo("            SubmitFeedResult\n");
                    $submitFeedResult = $response->getSubmitFeedResult();
                    if ($submitFeedResult->isSetFeedSubmissionInfo()) { 
                        echo("                FeedSubmissionInfo\n");
                        $feedSubmissionInfo = $submitFeedResult->getFeedSubmissionInfo();
                        if ($feedSubmissionInfo->isSetFeedSubmissionId()) 
                        {
                            echo("                    FeedSubmissionId\n");
                            echo("                        " . $feedSubmissionInfo->getFeedSubmissionId() . "\n");
                        }
                        if ($feedSubmissionInfo->isSetFeedType()) 
                        {
                            echo("                    FeedType\n");
                            echo("                        " . $feedSubmissionInfo->getFeedType() . "\n");
                        }
                        if ($feedSubmissionInfo->isSetSubmittedDate()) 
                        {
                            echo("                    SubmittedDate\n");
                            echo("                        " . $feedSubmissionInfo->getSubmittedDate()->format(DATE_FORMAT) . "\n");
                        }
                        if ($feedSubmissionInfo->isSetFeedProcessingStatus()) 
                        {
                            echo("                    FeedProcessingStatus\n");
                            echo("                        " . $feedSubmissionInfo->getFeedProcessingStatus() . "\n");
                        }
                        if ($feedSubmissionInfo->isSetStartedProcessingDate()) 
                        {
                            echo("                    StartedProcessingDate\n");
                            echo("                        " . $feedSubmissionInfo->getStartedProcessingDate()->format(DATE_FORMAT) . "\n");
                        }
                        if ($feedSubmissionInfo->isSetCompletedProcessingDate()) 
                        {
                            echo("                    CompletedProcessingDate\n");
                            echo("                        " . $feedSubmissionInfo->getCompletedProcessingDate()->format(DATE_FORMAT) . "\n");
                        }
                    } 
                } 
                if ($response->isSetResponseMetadata()) { 
                    echo("            ResponseMetadata\n");
                    $responseMetadata = $response->getResponseMetadata();
                    if ($responseMetadata->isSetRequestId()) 
                    {
                        echo("                RequestId\n");
                        echo("                    " . $responseMetadata->getRequestId() . "\n");
                    }
                } 

                echo("            ResponseHeaderMetadata: " . $response->getResponseHeaderMetadata() . "\n");
     } catch (MarketplaceWebService_Exception $ex) {
         echo("Caught Exception: " . $ex->getMessage() . "\n");
         echo("Response Status Code: " . $ex->getStatusCode() . "\n");
         echo("Error Code: " . $ex->getErrorCode() . "\n");
         echo("Error Type: " . $ex->getErrorType() . "\n");
         echo("Request ID: " . $ex->getRequestId() . "\n");
         echo("XML: " . $ex->getXML() . "\n");
         echo("ResponseHeaderMetadata: " . $ex->getResponseHeaderMetadata() . "\n");
     }
 }

Open in new window

0
 

Author Comment

by:QMBB
ID: 41772013
Ray,

Tried your altered script, got a cron error email to my main server account email address:

Fatal error: Class 'MarketplaceWebService_Client' not found in /usr/www/users/myuser/myfolder/anotherfolder/script/SubmitFeed2.php on line 17

I looked for anything around that line altered but it looks the same as the version which doesn't throw an error.
0
 

Author Comment

by:QMBB
ID: 41772033
I altered the version I attached before to fully qualify the paths to the .config file and the feed.txt file. Still no go. No errors, but again no results.
0
 

Author Comment

by:QMBB
ID: 41772241
Ray,

Hopefully you have time and can look at what might have broken it in your version... I'd like to get that version working.
0
 
LVL 109

Expert Comment

by:Ray Paseur
ID: 41772264
I don't think I can fix this from where I sit, but maybe we can find a way forward.  The missing class was probably supposed to be included by the statement on line 6.  If so, you would need to find a way to give a correct URL on line 6.  This same issue may be there on line 24, too.

Try changing line 6 from include_once ('.config.inc.php'); to require_once ('.config.inc.php');

That should be expected to fail the first time because require() is expected to fail if the path is wrong or the file is missing.  Then when you change the path to correctly locate config.inc.php, you will know that you're getting the file because require() will not fail.
0
 

Author Comment

by:QMBB
ID: 41772329
Ray,

Did this, ran it, got exact same error:

<?php
ob_start(); // COLLECT THE "BROWSER" OUTPUT
ini_set('display_errors', TRUE); // GET "BROWSER" OUTPUT FOR ERROR DISPLAY
error_reporting(E_ALL); // RAISE ERROR REPORTING LEVEL TO HIGHEST

require_once ('/usr/www/users/myuser/myfolder/anotherfolder/script/.config.inc.php');

$serviceUrl = "https://mws.amazonservices.com";

$config = array (
  'ServiceURL' => $serviceUrl,
  'ProxyHost' => null,
  'ProxyPort' => -1,
  'MaxErrorRetry' => 3,
);

 $service = new MarketplaceWebService_Client(
     AWS_ACCESS_KEY_ID,
     AWS_SECRET_ACCESS_KEY,
     $config,
     APPLICATION_NAME,
     APPLICATION_VERSION);

$feed = file_get_contents("/usr/www/users/myuser/myfolder/anotherfolder/script/feed.txt"); // IS THIS FILE PATH CORRECT?
var_dump($feed); // SEE IF WE GOT WHAT WE WANTED FROM "feed.txt"

$marketplaceIdArray = array("Id" => array('ABC12345678'));

$feedHandle = fopen('php://memory', 'rw+'); // REMOVED ERROR CRONTROL OPERATOR
fwrite($feedHandle, $feed);
rewind($feedHandle);

etc etc
0
 
LVL 109

Expert Comment

by:Ray Paseur
ID: 41772494
Are you sure these file paths are correct?  What do you see if you isolate this file and print out the contents?  In particular, is there the expected class definition for MarketplaceWebService_Client?

'/usr/www/users/myuser/myfolder/anotherfolder/script/.config.inc.php'
0
 

Author Comment

by:QMBB
ID: 41775380
Ray,

I think you found it... the path is indeed correct, but if you notice at the bottom of the file I attached earlier, the code just stops, no php end. There are a few files up one level from .config which need to be there in order for it to run ( I moved them all into same folder as a test and it wouldn't run). That web service must be specified in one of those.

I could mush all of it together, but I don't see anywhere that the other files are called for in what I attached earlier... do you?
0
 
LVL 109

Expert Comment

by:Ray Paseur
ID: 41775386
the code just stops, no php end
Can you please give me an example of this or paraphrase the explanation?  I'm trying to visualize it, but I'm coming up blank, sorry.
0
 

Author Comment

by:QMBB
ID: 41775388
Here's what I attached before... you can see at the end that it just trails off, doesn't end php. That and my failed test when I put all the files in the same folder as the .config file tells me that the other files are being called and used when i run a successful test from a browser...

<?php

include_once ('.config.inc.php'); 

$serviceUrl = "https://mws.amazonservices.com";

$config = array (
  'ServiceURL' => $serviceUrl,
  'ProxyHost' => null,
  'ProxyPort' => -1,
  'MaxErrorRetry' => 3,
);

 $service = new MarketplaceWebService_Client(
     AWS_ACCESS_KEY_ID, 
     AWS_SECRET_ACCESS_KEY, 
     $config,
     APPLICATION_NAME,
     APPLICATION_VERSION);

$feed = file_get_contents("feed.txt");

$marketplaceIdArray = array("Id" => array('ABCD1234ETC'));

$feedHandle = @fopen('php://memory', 'rw+');
fwrite($feedHandle, $feed);
rewind($feedHandle);

$request = new MarketplaceWebService_Model_SubmitFeedRequest();
$request->setMerchant(MERCHANT_ID);
$request->setMarketplaceIdList($marketplaceIdArray);
$request->setFeedType('_POST_FLAT_FILE_LISTINGS_DATA_');
$request->setContentMd5(base64_encode(md5(stream_get_contents($feedHandle), true)));
rewind($feedHandle);
$request->setPurgeAndReplace(false);
$request->setFeedContent($feedHandle);
$request->setMWSAuthToken('<MWS Auth Token>'); // Optional

rewind($feedHandle);

invokeSubmitFeed($service, $request);

@fclose($feedHandle);
                                        
  function invokeSubmitFeed(MarketplaceWebService_Interface $service, $request) 
  {
      try {
              $response = $service->submitFeed($request);
              
                echo ("Service Response\n");
                echo ("=============================================================================\n");

                echo("        SubmitFeedResponse\n");
                if ($response->isSetSubmitFeedResult()) { 
                    echo("            SubmitFeedResult\n");
                    $submitFeedResult = $response->getSubmitFeedResult();
                    if ($submitFeedResult->isSetFeedSubmissionInfo()) { 
                        echo("                FeedSubmissionInfo\n");
                        $feedSubmissionInfo = $submitFeedResult->getFeedSubmissionInfo();
                        if ($feedSubmissionInfo->isSetFeedSubmissionId()) 
                        {
                            echo("                    FeedSubmissionId\n");
                            echo("                        " . $feedSubmissionInfo->getFeedSubmissionId() . "\n");
                        }
                        if ($feedSubmissionInfo->isSetFeedType()) 
                        {
                            echo("                    FeedType\n");
                            echo("                        " . $feedSubmissionInfo->getFeedType() . "\n");
                        }
                        if ($feedSubmissionInfo->isSetSubmittedDate()) 
                        {
                            echo("                    SubmittedDate\n");
                            echo("                        " . $feedSubmissionInfo->getSubmittedDate()->format(DATE_FORMAT) . "\n");
                        }
                        if ($feedSubmissionInfo->isSetFeedProcessingStatus()) 
                        {
                            echo("                    FeedProcessingStatus\n");
                            echo("                        " . $feedSubmissionInfo->getFeedProcessingStatus() . "\n");
                        }
                        if ($feedSubmissionInfo->isSetStartedProcessingDate()) 
                        {
                            echo("                    StartedProcessingDate\n");
                            echo("                        " . $feedSubmissionInfo->getStartedProcessingDate()->format(DATE_FORMAT) . "\n");
                        }
                        if ($feedSubmissionInfo->isSetCompletedProcessingDate()) 
                        {
                            echo("                    CompletedProcessingDate\n");
                            echo("                        " . $feedSubmissionInfo->getCompletedProcessingDate()->format(DATE_FORMAT) . "\n");
                        }
                    } 
                } 
                if ($response->isSetResponseMetadata()) { 
                    echo("            ResponseMetadata\n");
                    $responseMetadata = $response->getResponseMetadata();
                    if ($responseMetadata->isSetRequestId()) 
                    {
                        echo("                RequestId\n");
                        echo("                    " . $responseMetadata->getRequestId() . "\n");
                    }
                } 

                echo("            ResponseHeaderMetadata: " . $response->getResponseHeaderMetadata() . "\n");
     } catch (MarketplaceWebService_Exception $ex) {
         echo("Caught Exception: " . $ex->getMessage() . "\n");
         echo("Response Status Code: " . $ex->getStatusCode() . "\n");
         echo("Error Code: " . $ex->getErrorCode() . "\n");
         echo("Error Type: " . $ex->getErrorType() . "\n");
         echo("Request ID: " . $ex->getRequestId() . "\n");
         echo("XML: " . $ex->getXML() . "\n");
         echo("ResponseHeaderMetadata: " . $ex->getResponseHeaderMetadata() . "\n");
     }
 }

Open in new window

0
 
LVL 109

Accepted Solution

by:
Ray Paseur earned 500 total points
ID: 41775400
This expert suggested creating a Gigs project.
The "end PHP" tag -- ?> -- is an Anti-Practice (see #14).  We avoid using that because it causes more problems than it's worth.  Most coding standards recommend against it.

I think at this point I've done all I can for you here.  You need an experienced PHP programmer to get "hands on" with your code and data, so I'll recommend that you explore E-E Gigs as a good way forward from here.

Best regards and best of luck with your project, ~Ray
0

Featured Post

Efficient way to get backups off site to Azure

This user guide provides instructions on how to deploy and configure both a StoneFly Scale Out NAS Enterprise Cloud Drive virtual machine and Veeam Cloud Connect in the Microsoft Azure Cloud.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Today, still in the boom of Apple, PC's and products, nearly 50% of the computer users use Windows as graphical operating systems. If you are among those users who love windows, but are grappling to keep the system's hard drive optimized, then you s…
Google Drive is extremely cheap offsite storage, and it's even possible to get extra storage for free for two years.  You can use the free account 15GB, and if you have an Android device..when you install Google Drive for the first time it will give…
Explain concepts important to validation of email addresses with regular expressions. Applies to most languages/tools that uses regular expressions. Consider email address RFCs: Look at HTML5 form input element (with type=email) regex pattern: T…
This video shows how to set up a shell script to accept a positional parameter when called, pass that to a SQL script, accept the output from the statement back and then manipulate it in the Shell.

803 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question