This is a quick and simple HowTo guide that’ll help you run a bash script every N seconds. Note that you can run root commands from the script as we’ll use
Create a service that’ll run your script
The first step is to setup a job that’ll execute the script whenever the timer will ask so. You can use
nano to make a new service called
/etc/systemd/system/, where you can choose name. If the package is not installed, run the following command and you may continue.
sudo apt-get install nano
Run nano to create the file:
sudo nano /etc/systemd/system/name.service
and fill it with (ctrl+shift+v to paste in terminal)
[Unit] Description=A short description [Service] Type=oneshot ExecStart=/bin/bash /path/to/script.sh
Description explains what the bash script does. It will be displayed when you list all active services with
/path/to/script.sh is your script’s location. You can get it by typing:
readlink -f yourscript.sh
Create a timer that will make
systemd run your service every N seconds
The second step is to setup a timer that will ask
systemd to run the service you previously created every N seconds. Once again, we’ll use
nano to create the file:
sudo nano /etc/systemd/system/name.timer
You need to use the same name string for both files. In the end, you should have created
Once you’re ready to edit the timer file, paste the following content:
[Unit] Description=A short description [Timer] OnUnitActiveSec=360s OnBootSec=10s [Install] WantedBy=timers.target
Description gives details about the service the timer is associated too, 360 can be replaced by the number of seconds (N) you need. You can leave the rest as it is,
OnBootSec is just making the timer run 10 seconds after every startup so that you don’t have to start it manually each time you reboot your machine!
Test your timer and service
The last step is to reload all
systemctl daemons, start your timer and check if it’s active. Note that when you start name.timer, it’ll run the service once and then every N seconds.
sudo systemctl daemon-reload sudo systemctl start name.timer systemctl list-timers
You should get an output looking like this:
Where your timer should be in the UNIT column and the time left before your service is run another time in the LEFT column.
That’s it! Your bash script and whatever commands it contains will be executed every N seconds, even if you restart your machine.
Published by Luka Lafaye de Micheaux