0

Here is script (/shutdown.py). It monitors button press and if button is pressed more than 3 seconds, it runs poweroff command.

#!/usr/bin/python

# Import the modules to send commands to the system and access GPIO pins
from subprocess import call
from time import sleep
import RPi.GPIO as gpio
import time

# Define a function to keep script running
def loop():
    raw_input()

# Define a function to run when an interrupt is called
def shutdown(pin):
    button_press_timer = 0
    while True:
        if (gpio.input(17) == False) : # while button is still pressed down
            button_press_timer += 1 # keep counting until button is released
            if button_press_timer == 3:
                #print "powering off"
                call('poweroff', shell=True)
            sleep(1)
        else: # button is released, figure out for how long
            #print "Poga atlaista. nospiesta bija " + str(button_press_timer) + " sekundes"
            #button_press_timer = 0
            return
#       sleep(1) # 1 sec delay so we can count seconds
#    print "powering off"

gpio.setmode(gpio.BCM) # Use BCM GPIO numbers
gpio.setup(17, gpio.IN, pull_up_down=gpio.PUD_UP) # Set up GPIO 17 as an input
gpio.add_event_detect(17, gpio.FALLING, callback=shutdown, bouncetime=200) # Set up an interrupt to look for button presses

loop() # Run the loop function to keep script running

If I run script from console like /shutdown.py all is fine. Button press is detected and system shutdown is initialed. But if i add that script to /etc/rc.local (/shutdown.py &), then it fails at startup with this error:

Traceback (most recent call last):
  File "/shutdown.py", line 35, in <module>
    loop() # Run the loop function to keep script running
  File "/shutdown.py", line 11, in loop
    raw_input()
EOFError: EOF when reading a line

If I comment out loop() line, then there is no error and script does not run in background. I just start and exit and button press not detected. So, how i can run that script at startup and keep running in background?

EDIT

I am not python guru and i think that loop() is python internal function. Now i seen that it is defined function which calls raw_input(). That script I found and modified to fit my needs. Thanks.

1 Answer 1

1

What you really need is a Python daemon which runs in the background. The raw_input method you are trying to use looks like an ugly hack to me.

Have a look at python-daemon package, which is meant exactly for your use case and is quite simple to use. There is also an updated fork with Python 3 support.

After installing python-daemon, add this line to the beginning of your script

import daemon

Then substitute the loop() call at the end of your script with this code:

with daemon.DaemonContext():
    while True:
        time.sleep(10)

This code is untested, but you get the idea.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.