I have a number of bottle.py web services that I run on my servers. For the last few years, I’ve been using tmux to launch these services and then detaching them so they continue running after I logout of the SSH session. Recently, one of those servers had an issue causing the provider to require moving my VPS to another machine. So, when I went to use it, I got the 503 Service Unavailable message (that no one likes to see)!

Today, I finally got around to setting up systemd service files for these services. It only took about an hour (including troubleshooting things not working). Below is the shopping.service file (for a web based shopping list I wrote):

# Save this file in ~/.config/systemd/user/shopping.service
# then run:
# $ systemctl --user daemon-reload
# $ systemctl --user enable shopping.service
# Below will prevent the service stopping when we terminate the SSH session
# $ sudo loginctl enable-linger username

Description=Shopping List (bottle.py)

ExecStart=/usr/bin/python3 /home/simon/web/shopping/shopping.py


Note: make sure to follow the comments. Otherwise, you’ll also have problems.

Once you’ve created and symlinked the file to ~/.config/systemd/user, you’ll be able to check all is good as you can for any system process.

simon@server:~/web/shopping [ssh] $ systemctl --user status shopping_list.service 
● shopping_list.service - Shopping List (bottle.py)
     Loaded: loaded (/home/simon/.config/systemd/user/shopping_list.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2023-03-25 20:26:29 GMT; 9min ago
   Main PID: 32632 (python3)
      Tasks: 11 (limit: 1129)
     Memory: 100.3M
        CPU: 7.471s
     CGroup: /user.slice/user-1000.slice/user@1000.service/app.slice/shopping_list.service
             └─32632 /usr/bin/python3 /home/simon/web/shopping/run_sl2.py

I’ll monitor this one service for a while, then I plan to use systemd service files for all my web services.