Jump to content

Systemd/timers/ru: Difference between revisions

From Official NixOS Wiki
Unabomberlive (talk | contribs)
Created page with "Следующий пример таймера запускает каждые 5 минут юнит systemd, который вызывает сценарий bash."
FuzzyBot (talk | contribs)
Updating to match new version of source page
 
(7 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{Systemd/breadcrumb}}
{{Systemd/breadcrumb}}


<div lang="en" dir="ltr" class="mw-content-ltr">
Таймеры - это файлы модулей systemd, чье имя заканчивается на .timer, которые управляют .service файлами или событиями. Таймеры могут быть использованы в качестве альтернативы <code>cron</code>.
Timers are systemd unit files whose name ends in .timer that control .service files or events. Timers can be used as an alternative to <code>cron</code>. Timers have built-in support for calendar-based events and monotonic time events, and can be run asynchronously.
Таймеры имеют встроенную поддержку событий, основанных на календаре, и монотонных временных событий, а также могут запускаться асинхронно.
</div>
<span id="Configuration"></span>
<span id="Configuration"></span>
== Настройка ==
== Настройка ==
Следующий пример таймера запускает каждые 5 минут юнит systemd, который вызывает сценарий bash.
Следующий пример таймера запускает каждые 5 минут юнит systemd, который вызывает сценарий bash.
<syntaxHighlight lang="nix">
<syntaxhighlight lang="nix">
systemd.timers."hello-world" = {
systemd.timers."hello-world" = {
   wantedBy = [ "timers.target" ];
   wantedBy = [ "timers.target" ];
Line 13: Line 12:
       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 25: Line 29:
     Type = "oneshot";
     Type = "oneshot";
     User = "root";
     User = "root";
    RemainAfterExit = true; # Prevents the service from automatically starting on rebuild. See https://discourse.nixos.org/t/how-to-prevent-custom-systemd-service-from-restarting-on-nixos-rebuild-switch/43431
   };
   };
};
};
</syntaxhighlight>
Alternatively here, avoid quotes when calling for the binary and its command options:
<syntaxHighlight lang="nix">
${pkgs.foo}/bin/foo command-options
</syntaxHighlight>
</syntaxHighlight>
<div lang="en" dir="ltr" class="mw-content-ltr">
 
The following example starts once a day (at 12:00am). When activated, it triggers the service immediately if it missed the last start time (option Persistent=true), for example due to the system being powered off.
This will yield the same result as running
</div>
<syntaxhighlight lang="bash">
foo command-options
</syntaxhighlight>
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====
 
Следующий пример запускается один раз в день (в 12:00). При активации он запускает службу немедленно, если пропущено время последнего запуска (опция Persistent=true), например, из-за отключения питания системы.
<syntaxHighlight lang="nix">
<syntaxHighlight lang="nix">
...
...
Line 44: Line 105:
<span id="Usage"></span>
<span id="Usage"></span>
== Использование ==
== Использование ==
<div lang="en" dir="ltr" class="mw-content-ltr">
Список активных таймеров и их текущее состояние:
List active timers and their current state:
</div>
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
systemctl list-timers
systemctl list-timers
</syntaxhighlight>
</syntaxhighlight>
<div lang="en" dir="ltr" class="mw-content-ltr">
Запустите службу вручную один раз в целях тестирования:
Manually run a service once for testing purposes:
</div>
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
systemctl start hello-world
systemctl start hello-world
</syntaxhighlight>
</syntaxhighlight>
[[Category:systemd]]
[[Category:systemd]]

Latest revision as of 22:30, 7 October 2025

Таймеры - это файлы модулей systemd, чье имя заканчивается на .timer, которые управляют .service файлами или событиями. Таймеры могут быть использованы в качестве альтернативы cron. Таймеры имеют встроенную поддержку событий, основанных на календаре, и монотонных временных событий, а также могут запускаться асинхронно.

Настройка

Следующий пример таймера запускает каждые 5 минут юнит systemd, который вызывает сценарий bash.

systemd.timers."hello-world" = {
  wantedBy = [ "timers.target" ];
    timerConfig = {
      OnBootSec = "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";
    };
};

systemd.services."hello-world" = {
  script = ''
    set -eu
    ${pkgs.coreutils}/bin/echo "Hello World"
  '';
  serviceConfig = {
    Type = "oneshot";
    User = "root";
    RemainAfterExit = true; # Prevents the service from automatically starting on rebuild. See https://discourse.nixos.org/t/how-to-prevent-custom-systemd-service-from-restarting-on-nixos-rebuild-switch/43431
  };
};


Alternatively here, avoid quotes when calling for the binary and its command options:

${pkgs.foo}/bin/foo command-options

This will yield the same result as running

foo command-options

in your terminal.

Verifying your timestamp for systemd.time

If you do not understand the format that systemd.time expects, you can use the systemd-analyze's calendar sub-command to understand the next N times when the timer will get triggered. Following is an example:

$ 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

Using the systemd.services.<name>.startAt 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 systemd.services.<name>.startAt option. This will have the underlying systemd module in nixpkgs create the timer for you, and set its OnCalendar field. Note that the semantics for OnCalendar are different to OnUnitActiveSec.

This example shows the previous hello-world service configured with startAt, running every 5 minutes.

systemd.services."hello-world" = {
  script = ''
    set -eu
    ${pkgs.coreutils}/bin/echo "Hello World"
  '';
  serviceConfig = {
    Type = "oneshot";
    User = "root";
  };
  startAt = "*:0/5";
};

Running timer on a schedule

Следующий пример запускается один раз в день (в 12:00). При активации он запускает службу немедленно, если пропущено время последнего запуска (опция Persistent=true), например, из-за отключения питания системы.

...
  timerConfig = {
      OnCalendar = "daily";
      Persistent = true; 
  };
};

More examples can be found at the Arch Wiki and at the systemd.timer manpage.

Использование

Список активных таймеров и их текущее состояние:

systemctl list-timers

Запустите службу вручную один раз в целях тестирования:

systemctl start hello-world