Hardware setup (computer, etc)
- Ubuntu server 18.04.1
- Serial To Usb Converter with 8 ports
Python version
- 2.7.15r1
Python program description
When the program starts to create some threads:
- Create one thread for the Modbus server.
- Run 1 thread for each serial port connected (
/dev/ttyUSBn) and start read the data.
Problem explanation
When I run the script using the normal command (python2.7 myProgram.py) it work, so the modbus server start and I can read the value, and I can also see the usb-serial convert blink on the TX-RX leds.
If I check the readed data they are correct, so the program is working properly.
The problem come out when I set up a crontab job that run my python script!
The modbus server start properly, but I can't see the usb-serial converter leds blink and the python program don't print the readed data. That means the program is not working on the "serial" side.
To create the job I has used the following commands:
crontab -e- selected nano (default option)
- added at the end of the file the cron command:
@reboot /usr/bin/python2.7 /myProgram.py
I can't figure out where the problem is, the program is not catching the exception and the process is still running until I stop it manually. If I stop it and run it manually after that it start and work properly.
To help you:
I have also tried to run it using **systemctl**, the problem is the same.
At boot the service start and if I check it I can read: Active(running), but the software is not reading from the serial port.
The questions are:
- How can I solve it?
- There is something wrong with the crontab job?
- Maybe crontab job can't access the /dev/ directory? How can I solve this?
I'm very confused about that, I hope the question is properly created and formatted.
EDIT 30/11/18:
I have removed the crontab command, and create a service to run the program using this procedure.
If I run the command: service supervision start I can see that the process is running correctly and on htop I have only 4 processes.
In this case, the program is not reading from the serial port, but the modbus server is working. You can see that I have just 4 processes and the cpu load is too high.
If I run it manually with the command: python2.7 LibSupervisione.py
The output of the htop command is:
outupt of working program
Here you can see that I have more processes, 1 for each thread that I create and the load on the cpu is properly distributed.
2 Answers 2
Your script probably requires a Console or some Environment variables, but in a systemd started process you dont have these automatically.
The easiest way would be to prepend /usr/bin/bash -c "your command" in your System unit in the field ExecStart to enable a Shell like Environment likle this:
ExecStart=/bin/bash -c "/usr/bin/python2.7 /myProgram.py"
WorkingDirectory=yourWorkingDir
Why do you Need to use cron? Use a systemd timer instead.
5 Comments
, but this is wrong, because the folder is in another folder, so the path is not absolute. The correct way is to use: path = "/Monitoraggio/Utility/config.txt". So I have to start from the /` directory!If you could run your code with the service like this: sudo service <service-name> start and get a good status using sudo service <serivice-name> status, you can test it in crontab -e like this (run every 5 minutes for test):
*/5 * * * * service <service-name> start
*/10 * * * * service <service-name> stop
Then using @rebote after with the above test.
OR:
Finally, if you want to run your code/service at the system startup, do it instead of cron jon:
Edit the rc.local file with an editor with the sudo permission, then:
#!/bin/sh -e
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
service <service-name> start
exit 0
[NOTE]:
This is the procedure of creating a service from your code.
7 Comments
service test start it run, I have a good status, but the serial port is not reading in any case. And the server Modbus is working correctly. If I run the code manually with python2.7 myProgram.py it work and read from the serial port.Explore related questions
See similar questions with these tags.
... myProgram.py >>/tmp/myProgram.log 2>&1, to get the error message and read crontab-not-running-my-python-script#!/usr/bin/env pythonshebang on top of your code, and setchmod 755to your code, but the best way is that you create a service from your code, I using from this procedure for that.>>/tmp/myProgram.log 2>&1in my crontab command, but nothing where printed in the file. As I told the problem is non that the cron job isn't running, but the problem is that it run, start just a piece of program. Thanks anyway for the help!#!/usr/bin/python2.7and I have updated the permission of the folder to 777 using this command:chmod 777 /programFolder/ -R