# systemd Talk First, let's make ourselves a simple python web server with flask: ```python3 from flask import Flask app = Flask(__name__) import os PORT = int(os.getenv('FLASK_PORT', 5000)) @app.route('/') def hello_world(): return 'Hello, PuPPy!' if __name__ == '__main__': app.run(port=PORT) ``` Cool! Let's try running it: ```bash $ python3 main.py ``` Unsurprising. But, what if we wanted to make sure that this was always running, and was started as soon as the computer turned on? systemd to the rescue! Let's create a service file at `systemdflaskdemo.service`: ``` [Unit] Description=A baby fask app [Service] ExecStart=/usr/bin/python3 /home/stuart/code/systemd-talk/main.py Environment=FLASK_PORT=8050 Restart=always [Install] WantedBy=default.target ``` This service config file tells systemd when and how to run our process - in this case a web server. After creating this config file, we tell systemd to enable this service for our user: ```bash $ systemctl --user enable $(pwd)/systemdflaskdemo.service ``` Cool! But it's not running yet, as we can see when checking the status of the service: ```bash $ systemctl --user status systemdflaskdemo.service ``` Simple enough to fix, let's just start it: ```bash $ systemctl --user start systemdflaskdemo.service ``` That `WantedBy=default.target` tells systemd that we want the process to start as soon as the user logs in, so we should be covered in the case of a system restart also, if we enable lingering for the current user: ```bash $ loginctl enable-linger $(whoami) ``` If you ever want to stop the service, that's also easy: ```bash $ systemctl --user stop systemdflaskdemo.service ``` And, say you want to totally remove the service? Just `disable` it! ```bash $ systemctl --user disable systemdflaskdemo.service ``` In my experience, `daemon-reload` hasn't always worked for reloading `--user` service configs, but I am still but a systemd noob. Hope this has helped!