我想知道如何运行所描述的服务,例如在非 Nix 操作系统上的模块中。例如,假设我有以下文件:
{config, pkgs, ... }:
{
systemd.user.services.mytestservice = {
description = "Mytestservice";
script = "while true; do echo 'YES'; sleep 1; done";
wantedBy = [ "default.target" ];
};
}
(或者最终没有用户systemd.services.mytestservice =
:)
我如何编译它并最终由非 root 用户在非 nixos 操作系统上运行它?
答案1
致谢:非常感谢您的clever
所有解释!
我们首先将配置文件写入myconfiguration.nix
:
{config, pkgs, ... }:
{
# You can actually remove the user, and still use it
# as a user if you link it in ~/.config/systemd/user/
# (do not forget to remove the `user` it in anything.nix
# as well)
systemd.user.services.mytestservice = {
description = "Mytestservice";
script = "while true; do echo 'YES'; sleep 1; done";
# Or:
# serviceConfig = {
# ExecStart = "${pkgs.bash}/bin/bash -c \"while true; do echo 'YES'; sleep 1; done\"";
# };
wantedBy = [ "default.target" ];
};
}
然后,您可以做几件事:
- 编译它
- 安装它
仅编译,您可以执行以下操作:
nix-build '<nixpkgs/nixos>' -I nixos-config=myconfiguration.nix -A 'config.systemd.user.units."mytestservice.service".unit'
default.nix
这个想法是,这会加载文件夹中的文件/your/nixpkgs/copy/nixos/
(为了获取 的路径,它检查包含多个“子键”的nixpkgs
变量,例如 : ),该变量可以在线获取NIX_PATH
NIX_PATH=nixpkgs=/your/nixpkgs/copy/:othervar=thepath
这里。该文件还需要<nixos-config>
我们用来-I
将 nixos-config 条目添加到NIX_PATH
环境变量中。然后,如果没有-A
,它将尝试构建一个完整的 nixos,因此我们只需指定我们只需要这个服务单元。
mytestservice.service
这将生成一个如下所示的文件:
$ cat result/mytestservice.service
[Unit]
Description=Mytestservice
[Service]
Environment="LOCALE_ARCHIVE=/nix/store/zzhablipzgpv8mvlcvagqjnham6lr944-glibc-locales-2.27/lib/locale/locale-archive"
Environment="PATH=/nix/store/bv1lw6a2kw0mn2y3lxhi43180idx6sp9-coreutils-8.31/bin:/nix/store/s1n4vl1f3in3nacalrc3xam0vyzpsfvs-findutils-4.6.0/bin:/nix/store/7d9bi31h40hky30f5scqx7r6wn311ain-gnugrep-3.3/bin:/nix/store/qg4qbkbca7qapfzpa8p991yjf944fc3w-gnused-4.7/bin:/nix/store/6bvd29jny80ka8df9prr5hrl5yz7d98k-systemd-239.20190219/bin:/nix/store/bv1lw6a2kw0mn2y3lxhi43180idx6sp9-coreutils-8.31/sbin:/nix/store/s1n4vl1f3in3nacalrc3xam0vyzpsfvs-findutils-4.6.0/sbin:/nix/store/7d9bi31h40hky30f5scqx7r6wn311ain-gnugrep-3.3/sbin:/nix/store/qg4qbkbca7qapfzpa8p991yjf944fc3w-gnused-4.7/sbin:/nix/store/6bvd29jny80ka8df9prr5hrl5yz7d98k-systemd-239.20190219/sbin"
Environment="TZDIR=/nix/store/20wmykp8fj2izxdj8lic8ggcfpdid5ka-tzdata-2019a/share/zoneinfo"
ExecStart=/nix/store/1f0wk7l4p7xv257dci8xxqz1k8nai9va-unit-script-mytestservice-start
现在,如果您希望能够调用它,您需要安装它:
nix-env -f '<nixpkgs/nixos>' -I nixos-config=myconfiguration.nix -iA 'config.systemd.user.units."mytestservice.service".unit'
这将链接mytestservice.service
到~/.nix-profile/mytestservice.service
.但 systemctl 期望它位于 中~/.config/systemd/user/
,因此我们链接它:
ln -s ~/.nix-profile/mytestservice.service ~/.config/systemd/user/
然后我们需要重新加载守护进程,我们可以尝试使用它:
systemctl --user daemon-reload
systemctl --user start mytestservice.service
但请注意,构建/安装命令很复杂且输入时间较长,因此我们可以创建一个文件,例如anything.nix
,它将为我们构建所有内容:
let
eval = import <nixpkgs/nixos> {
configuration = ./myconfiguration.nix;
};
pkgs = import <nixpkgs>{};
in pkgs.buildEnv {
name = "things";
paths = [
eval.config.systemd.user.units."mytestservice.service".unit
];
}
现在,您可以使用以下命令进行编译:
nix-build anything.nix
并安装
nix-env -f anything.nix -i things
请注意,您可能需要删除我们第一次使用其他方法安装的文件,方法如下:
nix-env --query
nix-env --uninstall unit-mytestservice.service
最后,这两个代码systemd.services
似乎systemd.services.users
都可以用此方法使用:D