如果我这样做:
read_test <- function(path, ...) {
path %>% readxl::read_excel(...)
}
read_test(path, skip = 10)
然后我收到此错误:
ln:无法创建符号链接'/etc/systemd/system/interos-es-mdb.service':只读文件系统
有人知道在nixos机器上安装服务的正确方法吗? (我是root用户)...这是供参考的服务:
#!/usr/bin/env bash
set -e;
cd "$(dirname "$BASH_SOURCE")"
ln -sf "$(pwd)/interos-es-mdb.service" '/etc/systemd/system/interos-es-mdb.service'
systemctl enable interos-es-mdb.service
systemctl start interos-es-mdb.service
更新: 也许我正在寻找的是“每用户”服务,而不是以root等身份运行的服务。
答案 0 :(得分:2)
NixOS是声明性操作系统。这意味着诸如/etc
之类的目录位于只读/nix/store
目录中。只有nix-daemon允许将nix-store挂载为可写的。因此,必须在systemd.services.<yourservice>
中创建一个configuration.nix
条目才能与基础系统进行交互。或者,您可以直接修补nixpkgs并将配置指向您的fork。
所有未由用户明确声明的运行服务都位于nixpkgs/nixos/modules
内部。
configuration.nix:
{
systemd.services.foo = {
enable = true;
description = "bar";
unitConfig = {
Type = "simple";
...
};
serviceConfig = {
ExecStart = "${foo}/bin/foo";
...
};
wantedBy = [ "multi-user.target" ];
...
}
几乎相同,除了它们以systemd.user.services
开头。另外,用户主目录不是以声明方式进行管理的,因此您也可以照常将常规的systemd单元文件放在$XDG_CONFIG_DIR/systemd
下。
systemd.services.<name>
的有效属性的完整列表,来自:NixOS手册
Module basics,来自:Wiki
答案 1 :(得分:0)
您的/etc/nixos/configuration.nix
中的适当条目可能类似于:
let
# assumes you build a derivation for your software and put it in
# /etc/nixos/pkgs/interosEsMdb/default.nix
interosEsMdb = import ./pkgs/interosEsMdb {};
in config.systemd.services.interosEsMdb = {
description = "Interos MongoDB+ES log capture";
after = ["network.target"];
wantedBy = ["multi-user.target"];
serviceConfig = {
# change this to refer to your actual derivation
ExecStart = "${interosEsMdb}/bin/syslog-exec.sh";
EnvironmentFile = "${interosEsMdb}/lib/es-service.env";
Restart = "always";
RestartSec = 1;
}
}
...假设您实际上为interosEsMdb
构建了一个派生(这是在NixOS上打包软件的唯一明智和正确的方法)。