user24312
user24312

Reputation: 73

Python script not runnig on boot - raspberry

I made a python script on my raspberry - /home/pi/bin/script.py:

#!/usr/bin/python

 from urllib2 import urlopen
 from time import sleep

 FILE  = "publicip"
 SITE  = "http://ipecho.net/plain"
 DELAY = 60 # seconds

 def get_ip():
    while True:
        # wait for DELAY seconds
        sleep(DELAY)

        # get my current public ip
        try:
            ip = urlopen(SITE).read()
        except IOError:
            continue
        # compare with the one in file
        file_value = open(FILE).read()
        if ip != file_value:                 # if they are not equal
            open(FILE, "w").write(ip)        # update the ip in file

 if __name__ == "__main__":
    get_ip()

It's propose is to get my public ip and store it in a file. I need this script run in a loop so it can update the file as soon the ip changes. If the power fail I want it to run when the raspberry restarts. So, I updated the /etc/rc.local file:

#!/bin/sh -e

/home/pi/bin/script.py
exit 0

After that I used sudo reboot to restart the raspberry. I'm using PuTTY from a windows computer to connect to the raspberry. After logging in again I used ps -e | grep script.py to see if my script was runnig but it was not. Then I runned the script manually and it worked!

What would you do to solve this problem?

Upvotes: 1

Views: 295

Answers (3)

Rolf of Saxony
Rolf of Saxony

Reputation: 22443

Your other option is to use cron
sudo crontab -e will open the crontab for you
you can set your script to run as often as you like and if you put in the entry:
@reboot /home/pi/bin/script.py
it should run during the boot sequence
other non numeric options are:

@yearly        Run once a year, "0 0 1 1 *".
@annually      (same as @yearly)
@monthly       Run once a month, "0 0 1 * *".
@weekly        Run once a week, "0 0 * * 0".
@daily         Run once a day, "0 0 * * *".
@midnight      (same as @daily)
@hourly        Run once an hour, "0 * * * *"

The standard entry is:

# Minute Hour Day of Month Month  Day of Week   Command
    0     *       *          *        *         /home/pi/bin/script.py
#Once an hour on the hour
    *     *       *          *        *         /home/pi/bin/script.py
#Every minute

Edit:
with reference to your comment, performing it with cron, means that you should take out the timing within your code, as that is what cron is doing. So you would end up up with something like:

#!/usr/bin/python

 from urllib2 import urlopen

 FILE  = "publicip"
 SITE  = "http://ipecho.net/plain"

 def get_ip():
    try:
        ip = urlopen(SITE).read()
    except IOError:
        continue
    # compare with the one in file
    file_value = open(FILE).read()
    if ip != file_value:                 # if they are not equal
        open(FILE, "w").write(ip)        # update the ip in file

 if __name__ == "__main__":
    get_ip()

With reference to your existing code, I notice that you are never closing the file, just an endless loop of opening it with read and then opening it with write, I'm not sure quite how python will handle that offhand but it certainly isn't good practice.

Upvotes: 0

Cristiano Araujo
Cristiano Araujo

Reputation: 1962

An alternative for running in the cron or init, it to use a userspace monitor.

This tutorial is great showing supervisor.

It is really easy to use.

apt-get install supervisor
service supervisor restart

add to /etc/supervisor/conf.d/ip_update.conf

[program:ip_update]
command=/home/pi/bin/script.py
autostart=true
autorestart=true
stderr_logfile=/var/log/ip_update.err.log
stdout_logfile=/var/log/ip_update.out.log

and you can still use supervisorctl to manage it:

$ supervisorctl
> restart ip_update

Upvotes: 1

Mateus Milanez
Mateus Milanez

Reputation: 125

First verify your script execution's permission, if it's have a execution permission. After that, you need use & after command of script in (runs to infinite loops), try:

#!/bin/sh
/home/pi/bin/script.py &

More details in raspbian documentation.

Upvotes: 0

Related Questions