Create a systemd Service for Auto-Start on Raspberry Pi
📖 Scenario: You want your Raspberry Pi to automatically run a simple script every time it boots up. This is useful for projects like home automation, data logging, or any task that should start without manual intervention.
🎯 Goal: Build a systemd service that runs a custom script automatically when the Raspberry Pi starts.
📋 What You'll Learn
Create a simple script file that prints a message to a log file
Create a systemd service file with the correct configuration
Enable the service to start on boot
Verify the service runs and outputs the expected message
💡 Why This Matters
🌍 Real World
Many Raspberry Pi projects need to run tasks automatically when the device powers on, such as starting servers, sensors, or automation scripts.
💼 Career
Understanding systemd services is important for Linux system administration, DevOps roles, and embedded systems development.
Progress0 / 4 steps
1
Create the script file
Create a file called /home/pi/startup_script.sh that writes the text "Raspberry Pi started" to /home/pi/startup.log. Use the exact command echo "Raspberry Pi started" >> /home/pi/startup.log inside the script.
Raspberry Pi
Hint
Use a text editor like nano or vim to create the script file. Don't forget to add the #!/bin/bash line at the top.
2
Create the systemd service file
Create a file called /etc/systemd/system/startup.service with these exact contents: [Unit] Description=Startup Script Service After=network.target
Use sudo nano /etc/systemd/system/startup.service to create the service file. Make sure the file has the exact sections and lines.
3
Enable and start the systemd service
Run these exact commands to enable the service to start on boot and start it now: sudo systemctl enable startup.service sudo systemctl start startup.service
Raspberry Pi
Hint
Use sudo because these commands need administrator rights.
4
Check the output log
Run cat /home/pi/startup.log to display the contents of the log file and verify it contains the text Raspberry Pi started.
Raspberry Pi
Hint
If you see the text Raspberry Pi started, the service worked correctly.
Practice
(1/5)
1. What is the main purpose of creating a systemd service on a Raspberry Pi?
easy
A. To update the Raspberry Pi operating system
B. To manually run a program only once
C. To make a program start automatically when the Raspberry Pi boots
D. To uninstall software from the Raspberry Pi
Solution
Step 1: Understand systemd service purpose
A systemd service is designed to manage programs and make them start automatically during boot.
Step 2: Identify the correct use case
Starting a program automatically on boot matches the purpose of systemd services.
Final Answer:
To make a program start automatically when the Raspberry Pi boots -> Option C
Quick Check:
systemd service = auto-start program [OK]
Hint: Remember: systemd services auto-start programs on boot [OK]
Common Mistakes:
Confusing systemd with manual program execution
Thinking systemd updates the OS
Believing systemd uninstalls software
2. Which of the following is the correct section header in a systemd service file to define the program to run?
easy
A. [Service]
B. [Unit]
C. [Install]
D. [Program]
Solution
Step 1: Recall systemd service file structure
A systemd service file has three main sections: [Unit], [Service], and [Install].
Step 2: Identify where the program command goes
The program to run is specified under the [Service] section using ExecStart.
Final Answer:
[Service] -> Option A
Quick Check:
Program command in [Service] section [OK]
Hint: Program command is always under [Service] section [OK]
What command should you run to make this service start automatically on boot?
medium
A. sudo systemctl start myscript.service
B. sudo systemctl enable myscript.service
C. sudo systemctl reload myscript.service
D. sudo systemctl stop myscript.service
Solution
Step 1: Understand difference between start and enable
Starting runs the service now; enabling sets it to run on boot.
Step 2: Identify command to auto-start on boot
Use sudo systemctl enable myscript.service to enable auto-start.
Final Answer:
sudo systemctl enable myscript.service -> Option B
Quick Check:
Enable = auto-start on boot [OK]
Hint: Enable service to auto-start, start to run now [OK]
Common Mistakes:
Using start instead of enable for auto-start
Confusing reload with enable
Stopping service instead of enabling
4. You created a systemd service file but after reboot, the program does not start. Which of these is the most likely mistake?
medium
A. You named the service file with a .txt extension
B. You used sudo systemctl start instead of enable
C. You put the program command under the [Unit] section
D. You forgot to run sudo systemctl daemon-reload after creating the service file
Solution
Step 1: Understand systemd reload requirement
After creating or changing service files, systemd must reload to recognize changes.
Step 2: Identify the missing reload command
Forgetting sudo systemctl daemon-reload means systemd ignores new service files.
Final Answer:
You forgot to run sudo systemctl daemon-reload after creating the service file -> Option D
Quick Check:
daemon-reload needed after service file changes [OK]
Hint: Always run daemon-reload after editing service files [OK]
Common Mistakes:
Skipping daemon-reload after file changes
Confusing start and enable commands
Placing ExecStart in wrong section
Wrong file extension for service files
5. You want your Raspberry Pi to run a Python script at boot, but only after the network is ready. Which systemd service file snippet correctly ensures this?
hard
A. [Unit]\nDescription=Run Python Script\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nExecStart=/usr/bin/python3 /home/pi/script.py\n\n[Install]\nWantedBy=multi-user.target
B. [Unit]\nDescription=Run Python Script\nRequires=network.target\n\n[Service]\nExecStart=/usr/bin/python3 /home/pi/script.py\n\n[Install]\nWantedBy=multi-user.target
C. [Unit]\nDescription=Run Python Script\nBefore=network-online.target\n\n[Service]\nExecStart=/usr/bin/python3 /home/pi/script.py\n\n[Install]\nWantedBy=multi-user.target
D. [Unit]\nDescription=Run Python Script\nAfter=multi-user.target\n\n[Service]\nExecStart=/usr/bin/python3 /home/pi/script.py\n\n[Install]\nWantedBy=network-online.target
Solution
Step 1: Understand network dependency in systemd
To run after network is ready, use After=network-online.target and Wants=network-online.target.
Step 2: Check each option's unit section
[Unit]\nDescription=Run Python Script\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nExecStart=/usr/bin/python3 /home/pi/script.py\n\n[Install]\nWantedBy=multi-user.target correctly uses both directives to wait for network online before starting.
Final Answer:
After=network-online.target and Wants=network-online.target -> Option A
Quick Check:
Use After and Wants with network-online.target for network wait [OK]
Hint: Use After=network-online.target and Wants=network-online.target [OK]
Common Mistakes:
Using network.target instead of network-online.target
Placing Before=network-online.target instead of After
Wrong WantedBy target
Missing Wants directive
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.