Python Forum

Full Version: Issues with Python script as service
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Setup details:
RPI Version: Raspberry Pi 2 Model BV1.1
Python Version: 2.7

I have created a small program to control the fan and lights in my hydroponic room. I am using 8 channel relay board with external power supply. Everything works fine if I run script using below command
‘sudo python /home/pi/lionsfort/hydroponic.py’. To stop the execution I type CTRL+C then script stops properly with relay getting power off.

Since I wanted script to start with Raspberry pi, I am running ‘hydroponic.py’ script as a service. But with script running as service created below problems
1. Only console logs getting written and file logs are empty.
2. Script starts ok with relay functioning properly, but when I stop the service (sudo systemctl stop hydroponic.service) relay wont get power off.
3. Script start with raspberry pi power on but also start with every new PUTTY session. There should be only one instance of script running irrespective PUTTY session.

Note: If run script using ‘sudo python /home/pi/lionsfort/hydroponic.py’ I don’t face any of above problems!!

Followed below process to run script as a service on boot: (ref http://www.diegoacuna.me/how-to-run-a-sc...an-jessie/)
1. cd /lib/systemd/system/
2. sudo nano hydroponic.service
3. hydroponic.service content
[Unit]
Description=Hydroponic
After=multi-user.target

[Service]
Type=simple
ExecStart=/usr/bin/python /home/pi/lionsfort/hydroponic.py
Restart=on-abort

[Install]
WantedBy=multi-user.target

4. To activate it, I ran below commands
a. sudo chmod 644 /lib/systemd/system/ hydroponic.service
b. chmod +x /home/pi/lionsfort/hydroponic.py
c. sudo systemctl daemon-reload
d. sudo systemctl enable hydroponic.service
e. sudo systemctl start hydroponic.service

logging.json

--
Satish Gunjal
Systemd logs into syslog, try to run:

sudo journalctl -u hydroponic
Also check the /var/log folder, maybe the stdout of your service is writing in the /var/log/message file.

About file logs, use the full path when writing them.
/home/pi/lionsfort/hydroponic.log
@gontajones Logs issue resolved after giving the full path of the log file. Thanks! Also please help me on issue 2: command " sudo systemctl stop hydroponic.service" stops service but relays are still power on!
Good, you're welcome!

About the "systemctl stop" command, it sends a SIGTERM to the service.
You'll have to get this signal (try: except:), reset the relays (clear GPIOs) and then exit.

Maybe your code now is just exiting.
Code snippet as below. Please suggest where to make change?

try:
    initialize()
    while True:	
        hourMinute = datetime.now().strftime('%H:%M')
        logger.info("Main()> hourMinute= " + hourMinute)
	
	humidityAndTemp();
	
        if(iState == 'off'):
            startInletFan(hourMinute)
        else:
            stopInletFan(hourMinute)            
        
	if(eState == 'off'):
            startExhaustFan(hourMinute)
        else:
            stopExhaustFan(hourMinute)
        
	if(vState == 'off'):
            startVentilationFan(hourMinute)
        else:
            stopVentilationFan(hourMinute)

	if(pState == 'off'):
            startPump(hourMinute)
        else:
            stopPump(hourMinute)
	
	time.sleep(30)

# End program cleanly with keyboard
except KeyboardInterrupt:
    print " Quit"

# Reset GPIO settings
GPIO.cleanup()
Could you edit your post (code) using the python tags?
Just click on "Insert python" at text formatting bar when editing (writing) posts.
done.
import time
import signal
import sys

def handler(signum, frame):
    print 'Got SIGTERM!'
    sys.exit(0) # raises a SystemExit exception

# Register a handler (function) for the SIGTERM signal
signal.signal(signal.SIGTERM, handler)

try:
    initialize()
    while True:
        hourMinute = datetime.now().strftime('%H:%M')
        logger.info("Main()> hourMinute= " + hourMinute)

        humidityAndTemp();

        if(iState == 'off'):
            startInletFan(hourMinute)
        else:
            stopInletFan(hourMinute)

        if(eState == 'off'):
            startExhaustFan(hourMinute)
        else:
            stopExhaustFan(hourMinute)

        if(vState == 'off'):
            startVentilationFan(hourMinute)
        else:
            stopVentilationFan(hourMinute)

        if(pState == 'off'):
            startPump(hourMinute)
        else:
            stopPump(hourMinute)

        time.sleep(30)

# End program cleanly with keyboard or sys.exit(0)
except KeyboardInterrupt:
    print " Quit (Ctrl+C)"
except SystemExit:
    print " Quit (SIGTERM)"

# Reset GPIO settings
GPIO.cleanup()
thanks. all issues resolved!