You Don't Love Systemd Timers Enough

(blog.tjll.net)

64 points | by yacin 4 hours ago

10 comments

  • gchamonlive 39 minutes ago
    Moved from cronie to systemd timers because they are resilient to system startup times. My backup strategy is to create a borg archive entry every day at a fixed time. With cronie the system needs to be running at the scheduled time, but systemd timer tolates this and runs the service as soons as the system is available.

    Btw this is my repo for the backup automation: https://github.com/gchamon/borg-automated-backups

  • hombre_fatal 1 hour ago
    NixOS comes with systemd, so I've been using it as a first-class part of managing stuff. It's great, especially coming from macOS' launchd.

    Which makes it nice to distribute a tool for NixOS so that it can lean into systemd instead of as some bolted-on afterthought.

    Makes me wonder what you'd do if you were distributing a lifecycle-heavy tool for Linux users in general since systemd isn't ubiquitous.

    I use a systemd timer to run a monthly scrub for my btrfs pool. Kinda cool how you can do increasingly useful things like skip the next scheduled event if the user initiates a scrub, do or don't accumulate tasks if you have a monthly task but the machine was offline for 6 months -- or fold them into a single task, etc.

    • Cyph0n 31 minutes ago
      +1, NixOS makes working with systemd a breeze. Defining units in Nix beats wrangling INI files.

        systemd.services.sync-recyclarr = {
          serviceConfig.Type = "oneshot";
          path = [ pkgs.podman ];
          script = ''
            podman exec -it recyclarr recyclarr sync radarr
            podman exec -it recyclarr recyclarr sync sonarr
          '';
        };
        systemd.timers.sync-recyclarr = {
          timerConfig = {
            OnCalendar = "daily";
            Persistent = true;
            Unit = "sync-recyclarr.service";
          };
          partOf = [ "sync-recyclarr.service" ];
          requires = [ "podman-recyclarr.service" ];
          wantedBy = [ "timers.target" ];
        };
    • drunner 43 minutes ago
      Have you been defining them directly in your flake.nix file? I too am on nixos but I keep all my configurations in their native format and symlink them with nix, that way I can take and reuse that config on a non nixos system easily.

      The problem I have found is that nixos doesn't seem to pickup and run systemd timers and services placed into the ~/.config/systems/user folder and additionally things like WantedBy=default.target have no effect.

      So after I restart all my services manually on reboot I agree, systems timers are cool.

      • Cyph0n 28 minutes ago
        I define all units in Nix because:

        a) It is way nicer and you get decent validation at build time

        b) A LLM can port units over if the need arises; it’s a very light abstraction around systemd syntax

        c) I personally don’t see how I would ever move to another distro :)

  • stryan 26 minutes ago
    Timers can work with arbitrary units (not just a similarly-named service unit) so they can be surprisingly flexible. I have a timer on my servers that starts a backup.target that fires off a full "restic backup","restic prune", "restic forget" backup cycle each morning with randomized start times and notifications. The actual restic-* units are Podman Quadlets so the whole setup runs agnosticaly of what's on the server, just as long as it has Podman and Systemd installed.

    I will admit thought, timers are up there in terms of being the clunkiest systemd unit type to use on a regular basis. I get why they're split up into two files and require different start vs enable syntax's, but man sometimes I just want to create a file that runs a script and be done with it.

    • esperent 18 minutes ago
      Why do you randomize your backup times?
  • lanycrost 3 minutes ago
    systemd is complex on first view, but after using it you didn't want to use anything else. It's handy to manage everything using systemctl
    • alyandon 0 minutes ago
      That and systemd having actually useful man pages.
  • ktm5j 59 minutes ago
    Oh I love them quite a lot! I use them to run all of our backup jobs, easy to set up and have never had an issue.
  • jjgreen 3 hours ago
    I've been almost convinced by systemd (and have switched to using it), but God the syntax of those service files is so ugly ...
    • zamadatix 1 hour ago
      Never thought I'd see hackers saying INI format looked ugly of all things. It's basic, sure, but that's a good thing for something meant to be easily editable by hand from any editor. Otherwise, it's just key value pairs in named sections, how ugly can it be about that?
      • ramon156 29 minutes ago
        TOML would look a lot more quiet, but I'm not sure if TOML would be a good fit
        • kevinmgranger 10 minutes ago
          unit files barely have any nesting, so the INI-like format is already 90% of the way towards TOML, no?
      • jjgreen 59 minutes ago
        key-value pairs where the = cannot be surrounded by spaces, so I have to write

          [Service]
          Type=oneshot
          WorkingDirectory={{ home }}/current/
          Environment=RAILS_ENV=production
          ExecStart=/bin/sh -lc "bin/db-backup --verbose"
        
        which fills me with sadness
        • voxic11 25 minutes ago
          Whitespace immediately before or after the equals sign is completely ignored by the parser. Its the standard INI format.
        • yjftsjthsd-h 35 minutes ago
          What? You absolutely can have spaces; most of mine look more like

            [Service]
            Type             = oneshot
            WorkingDirectory = %h/current/
            Environment      = RAILS_ENV=production
            ExecStart        = /bin/sh -lc "bin/db-backup --verbose"
          • jjgreen 23 minutes ago
            Friend, you have changed my life
    • mrweasel 55 minutes ago
      There's definitely some weirdness to certain parts of systemd service files, but was a huge improvement over Upstart and the old SysV-style init scripts.

      Over all I think Systemd get way to much criticism. You don't have to use all the parts, but if you care to go through the documentation you'll find interesting features such as journald log-shipping and systemd-machined which can manage containers and VMs.

    • SEJeff 46 minutes ago
      Oh yes, because the well documented clean syntax of sys v init shell scripts was so nice.

      If I never recall hacking in ulimit calls in the top of buggy shell scripts for crappy old services that done respect pam_limits it won’t be soon enough.

    • whateveracct 1 hour ago
      This is why I like NixOS. Defining systemd services in it is very neat.
    • WesolyKubeczek 1 hour ago
      Could have been worse.

      Could have been YAML.

      Could have been XML.

      • silvestrov 1 hour ago
        XML would have the advantage of having a grammar so we could validate the config files.

        It would also make it much simpler to make good GUI editors for the files instead of the Notepad approach most unix config files take.

        • pwdisswordfishq 30 minutes ago
          The systemd dialect of INI is actually pretty well-defined though.

          https://www.freedesktop.org/software/systemd/man/latest/syst...

        • WesolyKubeczek 1 hour ago
          Since systemd is successfully parsing its INI files, and barks at you when you put weird shit into them, a grammar for them does exist as well.

          XML is that wonderful format that gave us vulnerabilities like death by million laughs, up to a certain moment, you could MitM DTDs, and a whole slew of everything-XML stuff back when XML was like AI is today, none of which I miss today.

          Oh, and remember times when programmers would argue whether argument order in XML files should be significant or not?

          But XML books with their idealized XML future description did give me the same warm fuzzies as some intricate clockwork mechanism to a Victorian geek.

        • Juliate 1 hour ago
          There are good GUI editors for XML?
      • jjgreen 1 hour ago
        To be honest, I think either of those would have been better ...
  • andrewstuart 41 minutes ago
    Even better is systemd socket activation.
    • interf4ce 19 minutes ago
      This is very interesting. I'm not sure what I'd use it for yet, but I imagine it could be useful for triggering ad hoc jobs over the network. Maybe have Home Assistant make a network call to kick off a daily back up when I leave the office at the end of a work day.
      • kevinmgranger 11 minutes ago
        I believe its original motivation was just speeding up boot times by starting fewer services, even if you'd eventually want the service running. This was achieved in the past with xinetd, but systemd made the approach more popular for the masses.
  • iso1631 1 hour ago
    > humble systemd
    • pwdisswordfishq 23 minutes ago
      That the same cannot be said of its maintainer is another matter.
  • iluvcommunism 48 minutes ago
    [dead]