Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does my command-line not run from cron?

I have a perl script (part of the XMLTV family of "grabbers", specifically tv_grab_oztivo).

I can successfully run it like this:

/sw/bin/perl /path/to/tv_grab_oztivo --output /path/to/tv.xml

I use the full paths to everything to eliminate issues with the Working Directory. Permissions shouldn't be a problem.

So, if I run it from the Terminal (Mac OSX) it works just fine.

But when I set it to run via a cron job, nothing appears to happen at all. No output is created etc.

There isn't anything wrong with the crontab as far as I can see, because if I substitute a helloworld.pl for the actual script, it runs just fine at the right time.

So, what can I do to debug? I can see from looking at %ENV in the two cases that the environment is very different, but what other approaches can I take to debugging? How can I see the output of the cron job, which might be some kind of perl "die" message or "not found" message from the shell or whatever?

Or should I be trying to somehow give the cron version of the command the same environment as when it's running as me?

like image 885
AmbroseChapel Avatar asked Apr 23 '09 02:04

AmbroseChapel


People also ask

Can cron run commands?

Cron reads the crontab (cron tables) for predefined commands and scripts. By using a specific syntax, you can configure a cron job to schedule scripts or other commands to run automatically.

How do you check if cron job is working or not?

The easiest way to see if a cron job (with its crontab settings) is working is to edit an existing cron job so that it produces a visible output. You can add a line of code in your existing script to output a result when the script is run.

What is the use of * * * * * In cron?

* * * * * is a cron schedule expression wildcard, meaning your cron job should run every minute of every hour of every day of every month, each day of the week.

What does cron 0 * * * * * mean?

*/5 * * * * Execute a cron job every 5 minutes. 0 * * * * Execute a cron job every hour.


1 Answers

It's often because you don't get the full environment when running under cron. Best bet is to capture the ouput by using the command:

( /sw/bin/perl /path/to/tv_grab_oztivo ... ) >/tmp/qq 2>&1

and then have a look at /tmp/qq.

If it does turn out to be a missing environment, then you may need to put:

. ~/.profile

or something similar, into the execution chain of your cron job, such as:

( . ~/.profile ; /sw/bin/perl /path/to/tv_grab_oztivo ... ) >/tmp/qq 2>&1
like image 174
paxdiablo Avatar answered Sep 22 '22 16:09

paxdiablo