【问题标题】:How to create a systemd service template in NixOS?如何在 NixOS 中创建 systemd 服务模板?
【发布时间】:2021-11-20 02:38:33
【问题描述】:

我尝试创建一个简单的模板服务:

systemd.services."myuser@" = {
  script = "echo Hi, %u";
};

很遗憾,%u 模板没有展开:

$ sudo systemctl start myuser@foo
$ journalctl --catalog --output=cat --unit myuser@foo
Started myuser@foo.service.
Hi, %u
myuser@foo.service: Succeeded.

这是因为 Nix 将模板字符串包装在脚本中:

$ systemctl status --lines=0 myuser@foo
● myuser@foo.service
     Loaded: loaded (/nix/store/wiq9v9kgj78yd3h4dc1rgx0jgdxizrp4-unit-myuser-.service/myuser@.service; static)
     Active: inactive (dead)
$ systemctl show --property ExecStart myuser@foo.service
ExecStart={ path=/nix/store/d6n5gj0llxi2sqhsb87rz7rl0l2rs4x7-unit-script-myuser_-start/bin/myuser_-start ; argv[]=/nix/store/d6n5gj0llxi2sqhsb87rz7rl0l2rs4x7-unit-script-myuser_-start/bin/myuser_-start ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }
$ cat /nix/store/d6n5gj0llxi2sqhsb87rz7rl0l2rs4x7-unit-script-myuser_-start/bin/myuser_-start
#!/nix/store/wv35g5lff84rray15zlzarcqi9fxzz84-bash-4.4-p23/bin/bash -e
echo Hi, %u

在 NixOS 中创建模板服务的规范方法是什么?我需要覆盖ExecStart,还是有更优雅的解决方案?

【问题讨论】:

    标签: nix nixos


    【解决方案1】:

    systemd.services.<name>.script 只是为了方便需要脚本而不是命令来启动的其他简单服务。定义ExecStart 非常好。

    systemd.services."myuser@" = {
      serviceConfig.ExecStart = "echo Hi, %u";
    };
    

    或将%u 作为参数传递:

    systemd.services."myuser@" = {
      serviceConfig.ExecStart = 
        let
          script = pkgs.writeScript "myuser-start" ''
            #!${pkgs.runtimeShell}
            user="$1"
            echo Hi, $user";
          '';
        in "${script} %u";
    };
    

    还是有更优雅的解决方案?

    没有优雅的配置。

    在我看来,优雅来自内在的简单,而抽象来自隐藏复杂性。

    当软件需要支持的用例多于它可以优雅地支持的用例时,就会出现配置。 NixOS 模块致力于为这些配置建模并在它们之上构建更高级别的模块和选项,形成可选的抽象。 (有趣的事实:你自己的配置也是一个模块,同样强大)

    如果您正在寻找值得欣赏的东西,事实上您有时可以选择在 NixOS 中使用哪些抽象,让您有选择的余地。这是在配置中很少见的内在简单性之后的下一个最好的事情,并且比强制抽象更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-05
      • 1970-01-01
      • 2017-08-11
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      • 1970-01-01
      • 2019-04-15
      相关资源
      最近更新 更多