4

I know this question has been answered many time. I refereed heemayls answer in this post to set up the cron job. However, it is not working. Any idea on what is going wrong?

*/1 * * * * /usr/bin/env python3 /home/me/DownloadImages1.0.py

The following is the output of crontab -l

# 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 * * * * /usr/bin/env python3 /home/me/DownloadImages1.0.py
Nilani Algiriyage
  • 161
  • 1
  • 4
  • 10
  • May you show us the output of crontab -l? – Gordster Mar 24 '20 at 20:50
  • Look up how to redirect your cron output into a file, so you can read it. – user535733 Mar 24 '20 at 20:59
  • @Gordster edited in the post. Thank you. – Nilani Algiriyage Mar 24 '20 at 21:01
  • 1
    Tell your script which display you wish the script to run, otherwise it won't run.

    */1 * * * * DISPLAY=:0.0 /usr/bin/env python3 /home/me/DownloadImages1.0.py

    – Geppettvs D'Constanzo Mar 24 '20 at 21:02
  • Thank you for that. Are you sure it's not running? I once had this same issue and I fixed it by changing all the paths within my python script itself to be full paths instead of relative. – Gordster Mar 24 '20 at 21:05
  • @Geppettvs D'Constanzo: Thanks a lot. That did work :) – Nilani Algiriyage Mar 24 '20 at 21:06
  • @Gordster: Thank you for your help. Now it is working. – Nilani Algiriyage Mar 24 '20 at 21:08
  • @user535733 : Thank you :) It is working :) – Nilani Algiriyage Mar 24 '20 at 21:08
  • What does "it's not working" mean? That is not a very helpful failure analysis. Are you sure it's finishing in less than one minute? Is it running more often than you expect? Less often? Is it running at different times than you expect? Is it not running? Is it running but exiting with an error? Is it running without an error but producing no output? Is it running without an error but producing wrong output? Is it running without an error, producing the correct output but taking longer than you expect? Is it producing the correct output but not exiting when it is finished? – Jörg W Mittag Mar 25 '20 at 06:19
  • What do the log files say, what is the standard output of the command, what is the standard error output of the command? What user does it run under? What user should it run under? Are the two the same? Does it require anything special from the environment? Are all paths set up correctly? Does it require an interactive shell? Does it require a login shell? – Jörg W Mittag Mar 25 '20 at 06:21
  • 1
    Note that */1 has no much sense. It means, every minute, where the rest of the integer division between that minute and one = zero. This always happens because everything can be divided by one without rest. You may have copy-pasted that from another script and then adapted. You can safetly replace */1 with * that it's its exact definition: run every minute. This does not solve your problem but simplify your answer. Having said that, your problem is in your specific Python script and you should read your crontab error logs. We can't help you without further information. – Valerio Bozz Mar 25 '20 at 08:22

2 Answers2

4

You need to tell your script which display you wish the script to run, otherwise it won't run.

Use a command like this:

*/1 * * * * DISPLAY=:0.0 /usr/bin/env python3 /home/me/DownloadImages1.0.py

You can also use a global DISPLAY variable just placing this at the top of your cronjobs list

# m h  dom mon dow   command
DISPLAY=:0.0
*/1 * * * * /usr/bin/env python3 /home/me/DownloadImages1.0.py

And you can also invoke the DISPLAY by exporting the variable from a bash script via

#!/bin/bash
export DISPLAY=":0.0"
/usr/bin/env python3 /home/me/DownloadImages1.0.py
  • 3
    Curious, what about the question lead you to know that DISPLAY:=0.0" needed to be added? That would be helpful to include in the answer – cutrightjm Mar 25 '20 at 05:35
  • 1
    Actually, the fact that the script required DISPLAY to be set should have been stated as a requirement by the OP in the question. – Jörg W Mittag Mar 25 '20 at 06:22
  • "Curios" is you didn't guess on your own. I have just seen this question and answered based on my experience, documented on this question https://askubuntu.com/q/733345/9598, whose comments leaded me to have this solution. – Geppettvs D'Constanzo Mar 25 '20 at 15:27
0

Nothing was working for me as well, because whatever I was doing, or the cron job you have written above is correct.

*/1 * * * * /usr/bin/env python3 /home/me/DownloadImages1.0.py

The problem was something else in my case which I never imagined, as when I execute the same python script on terminal, it would run fine.

python3 /home/me/DownloadImages1.0.py

Until I read somewhere that, the crontab version, runs as, when we run command via sudo su

When I ran, python3 /home/me/DownloadImages1.0.py in sudo su, it started giving me library not installed errors. After I did pip3 install xxx libraries install inside sudo su itself, the command ran successfully.

After that, crontab ran successfully as well.

In short try following out -

1- create hello.py

print('hello')

2- write a cron job to execute above python script and output to some log file, to verify whether your crontab is actually working without any python dependency.

sudo touch /home/me/out.txt
sudo crontab -e
1 (put next minute here) * * * * /usr/bin/env python3 /home/me/DownloadImages1.0.py > /home/me/out.txt

3- Check the logs of crontab

tail -f /var/log/syslog | grep cron -i

After your hello.py script is executed, check the out.txt file. If it has contents then everything is fine (this answer is only valid if there is output in out.txt).

4- sudo su 5- make following command run successfully.

tail -f /var/log/syslog | grep cron -i

6- Now, your cron job */1 * * * * /usr/bin/env python3 /home/me/DownloadImages1.0.py should run successfully.

Satys
  • 101