Though a Raspberry Pi can act like a conventional desktop computer, my RPi projects are generally “headless”, in that no monitor, keyboard or mouse are present. This means that we must “harden” the system settings and code to be self-starting and fault-tolerant. Here are the steps I took to ensure that my CTA bus tracker could run indefinitely without user input.
- Set the default user “pi” to automatically log in on power up.
- Follow these instructions to daemonize your script. This allows it to run as a service, which is easier to monitor and restart.
- Install and configure Monit to resurrect the daemon if it dies. A script can die/exit unexpectedly if it encounters an unhandled error. It’s good practice to take care of these errors within the script itself, but I kept getting occasional script exits despite my best efforts. Here’s a nice little python tutorial about exceptions.
- sudo nano /etc/kbd/config and search for BLANK_TIME=30 and POWERDOWN_TIME=30. Change both values to zero (meaning never). This prevents the Pi from falling asleep.
Update: I’ve been chasing bugs for a month, and I’ve finally got 24 hours of up time according to Monit. I think the problem had to do with the python requests module. I added a timeout to each URL request, allowing the loop to continue even if the CTA server is acting up.
Update 2: It also looks like the API will start bouncing requests once you hit a certain number in 24 hours from the same IP.