Modern Debian systems use systemd as their init system, though some legacy systems might still use SysVinit. We'll cover both approaches to ensure compatibility.
For Debian 8 and newer versions, systemd provides a robust way to manage services:
# Create a service unit file
sudo nano /etc/systemd/system/myservice.service
Sample service file content:
[Unit]
Description=My Custom Service
After=network.target
[Service]
Type=simple
ExecStart=/path/to/startup.sh
ExecStop=/path/to/shutdown.sh
Restart=on-failure
User=myuser
[Install]
WantedBy=multi-user.target
Enable and start the service:
sudo systemctl daemon-reload
sudo systemctl enable myservice.service
sudo systemctl start myservice.service
For older Debian systems, use the traditional init.d method:
sudo cp startup.sh /etc/init.d/myservice
sudo chmod +x /etc/init.d/myservice
sudo update-rc.d myservice defaults
For shutdown scripts, create a symlink in the appropriate runlevel:
sudo ln -s /etc/init.d/myservice /etc/rc0.d/K01myservice
sudo ln -s /etc/init.d/myservice /etc/rc6.d/K01myservice
Your scripts should:
- Include proper shebang (#!/bin/bash)
- Implement status return codes (0 for success, others for errors)
- Include logging functionality
- Handle SIGTERM properly for graceful shutdowns
#!/bin/bash
# Logging setup
LOG_FILE=/var/log/myservice.log
exec > >(tee -a "$LOG_FILE")
exec 2>&1
echo "$(date) - Starting My Service"
# Your startup commands here
/path/to/your/server --daemon
exit 0
#!/bin/bash
# Logging setup
LOG_FILE=/var/log/myservice.log
exec > >(tee -a "$LOG_FILE")
exec 2>&1
echo "$(date) - Stopping My Service"
# Graceful shutdown procedure
if [ -f /var/run/myservice.pid ]; then
kill -TERM $(cat /var/run/myservice.pid)
rm -f /var/run/myservice.pid
fi
exit 0
Check service status:
systemctl status myservice # For systemd
service myservice status # For SysVinit
View logs:
journalctl -u myservice -b # For systemd
tail -f /var/log/myservice.log # For both methods
Debian traditionally used System V init system, but modern versions may use systemd. We'll cover both approaches to ensure compatibility.
For legacy systems or when you need maximum compatibility:
# Create your startup script
sudo nano /etc/init.d/myserver
#!/bin/bash
### BEGIN INIT INFO
# Provides: myserver
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: My Server Application
# Description: Custom server application startup/shutdown script
### END INIT INFO
case "$1" in
start)
echo "Starting myserver"
/path/to/startup.sh
;;
stop)
echo "Stopping myserver"
/path/to/shutdown.sh
;;
*)
echo "Usage: /etc/init.d/myserver start|stop"
exit 1
;;
esac
exit 0
Make it executable and register:
sudo chmod +x /etc/init.d/myserver
sudo update-rc.d myserver defaults
For systems using systemd (Debian 8+):
# Create service file
sudo nano /etc/systemd/system/myserver.service
[Unit]
Description=My Server Application
After=network.target
[Service]
ExecStart=/path/to/startup.sh
ExecStop=/path/to/shutdown.sh
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Enable and start the service:
sudo systemctl daemon-reload
sudo systemctl enable myserver.service
sudo systemctl start myserver.service
To check if your script is working:
# For System V
sudo service myserver status
# For systemd
sudo systemctl status myserver.service
# View boot logs
journalctl -b
- Always test scripts manually before adding to startup
- Include proper error handling in your scripts
- Consider using absolute paths in your scripts
- Document any dependencies your scripts require
For simple cases, you can also use:
# Adding to rc.local (not recommended for production)
sudo nano /etc/rc.local
/path/to/startup.sh &
exit 0
Or using cron:
@reboot /path/to/startup.sh