Comment by jorvi

Comment by jorvi 5 days ago

21 replies

> it's literally a new random problem every other boot because of this non-deterministic startup, which was never a problem with traditional init or /etc/rc

This gave me a good chuckle. Systemd literally was created to solve the awful race conditions and non-determinism in other init systems. And it has done a tremendous job at it. Hence the litany of options to ensure correct order and execution: https://www.freedesktop.org/software/systemd/man/latest/syst...

And outside of esoteric setups I haven't ever encountered the problems you mentioned with service files.

direwolf20 5 days ago

systemd was created to solve the problems of a directory full of shell scripts. A single shell script has completely different problems. And traditional init uses inittab, which is not /etc/init.d, and works more like runit.

runit's approach is to just keep trying to start the shell script every 2 seconds until it works. One of those worse–is–better ideas, it's really dumb, and effective. You can check for arbitrary conditions and error–exit, and it will keep trying. If you need the time synced you can just make your script fail if the time is not synced.

traditional inittab is older than that and there's not any reason to use it when you could be using runit, really.

blibble 5 days ago

yeah, many options that are complicated beyond the understanding of the distro maintainers, and yet still don't allow expression of common semantics required to support network services reliably

like "at least one real IP address is available" or "time has been synced"

and it's not esoteric, even ListenAddress with sshd doesn't even work reliably

the ONLY piece of systemd I've not had problems with is systemd-boot, and then it turned out they didn't write that

  • jorvi 5 days ago

    > like "at least one real IP address is available" or "time has been synced"

    "network-online.target is a target that actively waits until the network is “up”, where the definition of “up” is defined by the network management software. Usually it indicates a configured, routable IP address of some kind. Its primary purpose is to actively delay activation of services until the network has been set up."

    For time sync checks, I assume one of the targets available will effectively mean a time sync has happened. Or you can do something with ExecStartPre. You could run a shell command that checks for the most recent time sync or forces one.

    • blibble 5 days ago

      it's the "usually" that's the problem

      this service (untouched by me) had:

      After=local-fs.target network-online.target remote-fs.target time-sync.target

      but it was still started without an IP address, and then failed to bind

      just like this sort of problem: https://github.com/systemd/systemd/issues/4880#issuecomment-...

      the entire thing is unreliable and doesn't act like you'd expect

      > Or you can do something with ExecStartPre. You could run a shell command that checks for the most recent time sync or forces one.

      at that point I might as well go back to init=/etc/rc

      • jorvi 5 days ago

        Are you running this particular unit file as a user unit or a system unit? Some targets like network-online.target don't work from user unit files.

        You could also try targeting NetworkManager or networkd's "wait-online" services. Or if that doesn't work, something is telling systemd that you have an IP when you don't. NetworkManager has "ipv4.may-fail" and "ipv6.may-fail" that might be errenously true.

        > at that point I might as well go back to init=/etc/rc

        The difference is that systemd is much better at ensuring correctness. If you write the invoked shell command properly, it'll communicate failure or success correct and systemd will then communicate that state to the unit. It's still a lot more robust than before.

      • magicalhippo 5 days ago

        > https://github.com/systemd/systemd/issues/4880

        I'm not a systemd hater or anything, but I continue to read stuff from Poettering which to me is deeply disturbing given the programs he works on.

        Saying it's not a bug that service is launched despite a stated required prerequisite dependency failed... WTF?

        Sure, I agree with him that most computers should probably boot despite NTP being unable to sync. But proposing that the solution to that is breaking Requires is just wild to me.

      • [removed] 5 days ago
        [deleted]
    • direwolf20 5 days ago

      Is it possible for network-online to mean that, or does network-on actually mean that?

      It is possible for a specification to be so abstract that it's useless.

      • jcgl 5 days ago

        That's entirely defined by whatever units order themselves before network-online.target (normally a network management daemon like NetworkManager or systemd-networkd). systemd itself doesn't define the details; that's left up to how that distro and sysadmin have configured the network manager/system.

    • bandrami 5 days ago

      Sysadmins really hate the word "usually", and that is at the root of just about every systemd headache I've had

ethin 5 days ago

Same. I run a server with a ton of services running on it which all have what I think are pretty complex dependency chains. And I also have used Linux with systemd on my laptop. Systemd has never, once, caused me issues.