Systemd/timers: Difference between revisions

added alternative example of the call for the binary and command, the quotes confused me when replicating this for rclone (maybe more me but didn't seem like it hurt to add)
DHCP (talk | contribs)
m use "console" highlighting and the "$" prefix for shell command snippets
 
(4 intermediate revisions by 4 users not shown)
Line 12: Line 12:
The following example timer runs a systemd unit every 5 minutes which invokes a bash script.
The following example timer runs a systemd unit every 5 minutes which invokes a bash script.
</translate>
</translate>
<syntaxHighlight lang="nix">
<syntaxhighlight lang="nix">
systemd.timers."hello-world" = {
systemd.timers."hello-world" = {
   wantedBy = [ "timers.target" ];
   wantedBy = [ "timers.target" ];
Line 18: Line 18:
       OnBootSec = "5m";
       OnBootSec = "5m";
       OnUnitActiveSec = "5m";
       OnUnitActiveSec = "5m";
      # Alternatively, if you prefer to specify an exact timestamp
      # like one does in cron, you can use the `OnCalendar` option
      # to specify a calendar event expression.
      # Run every Monday at 10:00 AM in the Asia/Kolkata timezone.
      #OnCalendar = "Mon *-*-* 10:00:00 Asia/Kolkata";
       Unit = "hello-world.service";
       Unit = "hello-world.service";
     };
     };
Line 32: Line 37:
   };
   };
};
};
</syntaxHighlight>
</syntaxhighlight>




Line 45: Line 50:
foo command-options
foo command-options
</syntaxhighlight>
</syntaxhighlight>
in your terminal.  
in your terminal.
 
==== Verifying your timestamp for systemd.time ====
If you do not understand the format that [https://www.freedesktop.org/software/systemd/man/latest/systemd.time.html systemd.time] expects, you can use the <code>systemd-analyze</code>'s <code>calendar</code> sub-command to understand the next ''N'' times when the timer will get triggered. Following is an example:<syntaxhighlight lang="shell-session">
$ systemd-analyze calendar --iterations=5 "10:00:00"
  Original form: 10:00:00
Normalized form: *-*-* 10:00:00
    Next elapse: Sat 2024-12-07 10:00:00 IST
      (in UTC): Sat 2024-12-07 04:30:00 UTC
      From now: 33min left
  Iteration #2: Sun 2024-12-08 10:00:00 IST
      (in UTC): Sun 2024-12-08 04:30:00 UTC
      From now: 24h left
  Iteration #3: Mon 2024-12-09 10:00:00 IST
      (in UTC): Mon 2024-12-09 04:30:00 UTC
      From now: 2 days left
  Iteration #4: Tue 2024-12-10 10:00:00 IST
      (in UTC): Tue 2024-12-10 04:30:00 UTC
      From now: 3 days left
  Iteration #5: Wed 2024-12-11 10:00:00 IST
      (in UTC): Wed 2024-12-11 04:30:00 UTC
      From now: 4 days left
</syntaxhighlight>
 
====Using the <code>systemd.services.&lt;name&gt;.startAt</code> shorthand====
 
If you only want a service to execute at an interval and don't plan to configure the timer much more, you can use the <code>systemd.services.&lt;name&gt;.startAt</code> option. This will have the underlying systemd module in nixpkgs create the timer for you, and set its <code>OnCalendar</code> field. Note that the semantics for <code>OnCalendar</code> are different to <code>OnUnitActiveSec</code>.
 
This example shows the previous <code>hello-world</code> service configured with <code>startAt</code>, running every 5 minutes.
 
<syntaxHighlight lang="nix">
systemd.services."hello-world" = {
  script = ''
    set -eu
    ${pkgs.coreutils}/bin/echo "Hello World"
  '';
  serviceConfig = {
    Type = "oneshot";
    User = "root";
  };
  startAt = "*:0/5";
};
</syntaxHighlight>


====Running timer on a schedule====
====Running timer on a schedule====
Line 72: Line 119:
List active timers and their current state:
List active timers and their current state:
</translate>
</translate>
<syntaxhighlight lang="bash">
<syntaxhighlight lang="console">
systemctl list-timers
$ systemctl list-timers
</syntaxhighlight>
</syntaxhighlight>
<translate>
<translate>
Line 79: Line 126:
Manually run a service once for testing purposes:
Manually run a service once for testing purposes:
</translate>
</translate>
<syntaxhighlight lang="bash">
<syntaxhighlight lang="console">
systemctl start hello-world
$ systemctl start hello-world
</syntaxhighlight>
</syntaxhighlight>
[[Category:systemd]]
[[Category:systemd]]