dotfiles/notes/linux/systemd_timers.md

1.6 KiB

Systemd Timers

Gen Z's crontab

Generally there are 3 pieces to a timer

  • The script being run
  • The systemd service defining which script to run
  • The systemd timer triggering the service

Tools

systemd-analyze calendar can be very handy at verifying timestamps

systemd-analyze calendar *-*-* *:10,20:10

Time is in the format:

DayOfWeek Year-Month-Day Hour:Minute:Second

To find suitable targets for things like Wants and After, see systemd.special(7). If you want to check the current status of your targets, use:

systemctl list-units --type target --state active
systemctl status network-online.target

Placing files

Scripts should be put in /usr/local/bin if they can be run by anyone or /usr/local/sbin if they should only be run by root

Define a xxx.service file in /etc/systemd/system. Set the timer as one of its Wants. network.target may be more appropriate in some cases. Do not add an [Install] section, as your timer already handles that

[Unit]
Description = Sends current ip address to uni servers
Wants = broadcast_ip.timer
Wants = network.target
After = network.target

[Service]
Type = oneshot
ExecStart = /usr/local/bin/broadcast_ip.sh

Now you'll need a timer file. It's easiest to make it have the same name as the service file and put it in the same /etc/systemd/system

[Unit]
Description = Sends current ip address to uni servers
Requires = broadcast_ip.service

[Timer]
Unit = broadcast_ip.service
OnCalendar = *-*-* *:15,45:00

[Install]
WantedBy = timers.target