In this post, I will introduce three ways to create a startup script in Ubuntu: systemd (systemctl command), crontab (@reboot directive), shell startup script (.bash_login, .bashrc, ...).

Assume that the script to be ran when startup is at /home/transang/startup.sh.

Create systemd startup script

Create systemd unit .service file in /etc/systemd/system, lets call it my-service.service. The content of this my-service.service file should contain as follows

[Unit]
Description=My custom startup script
# After=network.target
# After=systemd-user-sessions.service
# After=network-online.target

[Service]
# User=spark
# Type=simple
# PIDFile=/run/my-service.pid
ExecStart=/home/transang/startup.sh start
# ExecReload=/home/transang/startup.sh reload
# ExecStop=/home/transang/startup.sh stop
# TimeoutSec=30
# Restart=on-failure
# RestartSec=30
# StartLimitInterval=350
# StartLimitBurst=10

[Install]
WantedBy=multi-user.target

Start/stop this service with systemctl start my-service.service, systemctl stop my-service.service.

To start this service when startup systemctl enable my-service.service.

Refer to this digital ocean post for more detail on the systemd unit file structure.

Add startup crontab job

Replace the repeat section of crontab definition with @reboot

In crontab -e, add this line @reboot /home/transang/startup.sh. ( source).

However, this approach is not reliable. There is also a bug in some Debian variants. The behavior is inconsistent between reboot and shutdown/start. Thus, I will not go more specifically on when this crontab is executed, where it is placed, who is the user running it, is this job executed with sudoer privilege.

Create shell startup script

Refer this post to understand startup scripts and their execution order. Note that you should never rely that a bash startup script is executed whenever a graphical login appears or after you login. Because this behavior varies a lot on the graphical program, even version to version.