Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Crontab not executing a Python script? [duplicate]

Tags:

python

cron

My python script is not running under my crontab.

I have placed this in the python script at the top:

#!/usr/bin/python 

I have tried doing this:

chmod a+x myscript.py 

Added to my crontab -e:

SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=""  * * * * * /home/me/project/myscript.py 

My /var/log/cron file says:

Sep 21 11:53:02 163-dhcp /USR/SBIN/CROND[2489]: (me) CMD (/home/me/project/myscript.py) 

But my script is not running because when I check my sql database, nothing has changed. If I run it directly in the terminal like so:

python /home/me/project/myscript.py 

I get the correct result.

This is the myscript.py:

#!/usr/bin/python  import sqlite3  def main():     con = sqlite3.connect("test.db")      with con:          cur = con.cursor()          cur.execute("CREATE TABLE IF NOT EXISTS testtable(Id INTEGER PRIMARY KEY, Name TEXT)")          cur.execute("INSERT INTO testtable(Name) VALUES ('BoB')")          cur.execute("SELECT * FROM testtable")          print cur.fetchall()      if __name__ == "__main__":     main() 

Per comments: Yes, /usr/bin/python exists. I can also run the python script directly using just /home/me/project/myscript.py. /usr/bin/python /home/me/project/myscript.py works. So I don't believe this is the cause?

like image 751
4 revs Avatar asked Sep 21 '12 16:09

4 revs


People also ask

Can a cron job run a Python script?

You'll learn in a bit what this table refers to. You should use Cron any time you want to automate something, like an OS job or a Python script. Needless to say, but an automated Python script can do basically anything. On Linux and macOS, the Crontab consists of six fields.

Why is my crontab script not running?

One of the most frequent causes for the crontab job not being correctly executed is that a cronjob does not run under the user's shell environment. Another reason can be – not specifying the absolute path of the commands used in the script.


2 Answers

There are a lot of half answers across the internet so I thought I would capture this to save someone else some time.

First, cronjob does a poor job of telling you where this is failing. I recommend sending stderr output to a log file like this:

Crontab Command:

# m h  dom mon dow   command * * * * * /path/to/your_file.sh >> out.txt  2>&1 

As this is likely running the command as user, check home directory for the log file. Note this script runs every minute which is good for debugging.

The next issue is you probably have a path problem... as script likely is trying to execute from your home directory. This script sets the current directory, echos it to file, and then runs your program.

Try this :

Script File

#!/bin/sh cd "$(dirname "$0")"; CWD="$(pwd)" echo $CWD python your_python_file.py 

Hope this saves someone else some debugging time!!!

like image 139
JJSanDiego Avatar answered Sep 23 '22 09:09

JJSanDiego


What happens when you type

/home/me/project/myscript.py into the shell?

Can you explicitly use /usr/bin/python in your crontbb command?

Can you either use an absolute path to your test.db or cd to the correct directory then execute your python script?

This is helpful to have debug statements in your python and log some data. Crontab can be very tricky to debug.

like image 21
dm03514 Avatar answered Sep 24 '22 09:09

dm03514