How to setup a Cron Job in Linux and Plesk

Wouldn’t it be great if something could be triggered even when you’re not around? Say once an hour, once a day, once a week or whenever you like in predetermined intervals?

Then you want to do this with what’s known as a Cron Job, or Scheduled Task.

Unfortunately, this is a bit beyond what WordPress can do, and it means getting down to the nitty gritty of the internal workings  of your server (after all, that’s where WordPress lives). Bear with me here, I’ll try my best to explain and show solutions.

I’m using a Cron Job with Manu Flury’s excellent Photo Q Plugin. It posts one of my pictures over at www.versluis.com every so many hours. But for this to work properly, both the WordPress Plugin and my (Linux) server need to be setup correctly.

Some WordPress Plugins (like Rob Felty’s Postie or Charles Johnson’s Feed WordPress) have similar functionality built in, but they rely on a visitor coming to your site at predetermined intervals. That’s not something you can control really. In most cases it works reliable enough for these plugins to work, however many others just don’t have that functionality, or require more accurate control. That’s where your Cron Job comes in.

So what on earth is a Cron Job?

In a nutshell, it’s a task that’s triggered at predetermined intervals. But it’s a bit like sitting in front of a Linux Prompt on your SSH connection, and all you have at your displosal is a keyboard with a black screen and white text to type in. What’s worse, your server doesn’t speak “WordPress”, or PHP for that matter. So all you can do really is to give him Linux commands.

In all likelyhood, you probably want to call a PHP file so that WordPress does something for you (such as check if it’s time for a new post, or maybe a database backup). And you can’t just tell Linux to go to that file, becasue it wouldn’t know what to do with it. I’ve tried this without success many times over (they nearly put me in a mental institution, seriously… I can assure you I’m much better now though).

So you need to find a command that calls your PHP file as if it were a browser. Lucky for us, the command “wget” will do the trick.

Wget is really designed for downloading a file to your server, but it’ll work fine for triggering a PHP file, just as a browser would do. The command for calling the Photo Q file for example looks like this:

Confused? Don’t be! Let me explain:

  • “/usr/bin/wget” tells the server where the wget command is (it’s a path to a file if you hadn’t guessed)
  • “-O – -q -t -1” are some random parameters, let’s not concern ourselves with those right now (if you really want to find out, type in “wget –help” at your SSH prompt)
  • “http://www.yourdomain.com/wimpq-cronpost.php” is the actual file you want to call, just like what you’d type into your browser

Now that we know how to call upon a PHP file from our command prompt, we need to tell our server to do this without us being there, and at what times he needs to do this. He’ll be more than happy to oblige, after all, that’s what he was designed to do.

How to setup a Cron Job in Plesk

I’ll focus on how to do this in Plesk 9 here, which refers to it as Scheduled Tasks (earlier versions of Plesk call it Crontab).

Here’s how you get there:

  • from the main menu on the left, select HOME
  • select DOMAINS
  • select the DOMAIN you want to run this task on
  • under Additional Tools, select SCHEDULED TASKS
  • choose the SYSTEM USER you would like this task to be run as
  • select SCHEDULE NEW TASK

OK, this was complicated enough to figure out – now comes the part nobody ever really talks about. It’s hard to explain, so please bear with me if I’m not making a whole lot of sense at first. In essence, you’re telling your server WHEN to do something, followed by WHAT to do.

  • Each field requires an entry. Don’t leave them blank.
  • The first tick box is to “switch on” the task. That’s what you want, unless you want to suspend the task. Tick it for now.
  • Now tell your server WHEN your task shall be run.
  • a “*” (i.e. star or asterisk) means “every”. So a star in minute would run the task “every minute”, likewise for hours and days of the month
  • You can also create the command “*/5” if you want your task run every 5 hours, every 5 days, every 5 minutes – you get the drift
  • Alternatively, put in the specific date (i.e. “Monday” and “17” for Monday at 5pm)

After all that, you’re left with one last line, which is the actual command or task you’d like to be run.

Like I explained above, for a PHP file to be called, use the wget command like so:

Obviously change the path to your file, including “http://”

Click OK on the bottom and your task should be setup. No need to reboot anything.

If at any time you feel you want to amend the task, you can do so by just modifying the parameters, or uncheck the “run task” tickbox to suspend the task completely.

If you want to know even MORE about Cron Jobs, check this out:

http://www.hingham-ma.com/sendstudionx/admin/resources/tutorials/cron_intro.html

Good Luck, and have fun 😉

Jay is the CEO and founder of WP Hosting, a boutique style managed WordPress hosting and support service. He has been working with Plesk since version 9 and is a qualified Parallels Automation Professional. In his spare time he likes to develop iOS apps and WordPress plugins, or draw on tablet devices. He blogs about his coding journey at http://wpguru.co.uk and http://pinkstone.co.uk.

15 thoughts on “How to setup a Cron Job in Linux and Plesk

  1. This post was not very helpful. The title is “How to setup a Cron Job *in WordPress*”. This does not seem to be any different than setting up a cron for any other PHP script, other than you’re using wget, rather than PHP directly. The title leads you to believe you explain how to setup your .php file to use pieces of WordPress and $wpdb, but your post contains no such information.

    For anyone looking to do this, all you need to do is include the /wp-load.php file in your cron file and you will have you DB Config and WPDB Class.

    1. Hi Brian,

      I’m very sorry you didn’t find the info useful – and reading back over the article I can understand why: the title is indeed misleading. I have changed it to “How to setup a cron job” because that’s what it’s about – nothing to do with WordPress.

      Thanks for contributing the wp-load.php tip – I’ll check it out!

      1. My website takes xml feeds from local estate agents, and imports their properties to display on my holiday accommodation website. The whole thing is written in wordpress, and up to now I have been manually triggering the script that imports the rental properties from the agents sites.

        Finally I have got round to automating the process and the missing link was the wp-load.php. Use it like this at the start of your script:

        require( ‘wp-load.php’ );

        This assumes your script is in the same folder as wp-load and from then on your script acts like it has been called from WordPress.

        I hope this is useful to someone else.

    1. Hmmm… good question. Since this is a public file it needs to be triggered via http. However, if you move the wimpq-cronpost.php file to somewhere above public level you should be able to trigger it via PHP from the command line queue for example – but I don’t know what the implications of the PhotoQ Plugin will be. I believe the developer said it needs to be in the root folder.

      I suppose it doesn’t really matter if you (or someone else) triggers the file more often than it needs to be called since the actual time in between automatic posts is determined via the Plugin Settings. Say you call this file every 5 minutes, but you setup PhotoQ to only post a new picture once every hour, then it will only post it once every hour.

  2. Hi,

    I am using a plesk panel with godaddy and i cannot find how to set up a cron job. What i would like to know is whether wordpress has any plugins or set-up a cron job.

    Many thanks

    Roy M J

    1. Hi Roy,

      WordPress has a built-in cron function which plugin developers can use. This however relies on somebody visiting your site regularly so it can appear to be unreliable. They do a good job for internal functions, but you can’t easily trigger a script without writing a plugin.

      Plesk calls Cron Jobs “Scheduled Tasks”, you can find those under Tools and Settings (in Hosting Provider View) or under Websites and Domains – Advanced (in Power User View).

  3. The way you prevent a user from triggering your cron php script early is simply ignore all IP’s/Hosts besides your servers.

    if (getenv(HTTP_X_FORWARDED_FOR)) {
    $ipaddress = getenv(HTTP_X_FORWARDED_FOR);
    } else {
    $ipaddress = getenv(REMOTE_ADDR); }

    if($ipaddress != “1.1.1.1”){
    //do nothing
    }

    I use it on my site http://cheapvpsdeals.info for various things.

  4. just a thought!

    what if I setup a php file with
    header(Location:’http://example.com’) which is my WordPress setup
    and trigger that php page via corn job.

    Would that work?

Add your voice!