在我的NixOS configuration.nix中,我创建了以下服务:
systemd.user.services.xcape-daemon = {
description = "Xcape Daemon";
after=[ "graphical.target" ];
serviceConfig = {
Type = "forking";
ExecStart = ''${pkgs.xcape} -e "Hyper-L=Tab;Hyper_R=less"'';
# ExecStop = "pkill xcape"; #pkill not found in path
Restart = "on-failure";
};
wantedBy = [ "default.target" ];
};
systemd.user.services.xcape-daemon.enable = true;但是,在检查服务状态时会出现以下错误:
Executable "xcape" not found in path "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin"问题是,这不是我的实际$PATH。
我的$PATH是:/home/user/bin /run/wrappers/bin /home/user/.nix-profile/bin /etc/profiles/per-user/user/bin /nix/var/nix/profiles/default/bin /run/current-system/sw/bin
发布于 2020-04-01 20:48:06
这实际上是意料之中的,因为systemd为编译时确定的$PATH使用了一个固定的值(以确定您是否在拆分-usr发行版上)。
引用自systemd.exec(5)手册页:
$PATH Colon-在启动可执行文件时要使用的目录列表。systemd在系统管理器中使用固定的"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin“值。当为具有“未合并的/usr”(/bin不是/usr/bin的符号链接)的系统编译时,":/sbin:/bin“被追加。在用户管理器的情况下,每个bin/和sbin/对都被切换,这样来自/usr/bin的程序比/usr/sbin中的程序具有更高的优先级,等等。建议不要以任何方式依赖这一点,并且在$PATH中只有一个具有给定名称的程序。
您有几个选项可以解决这个问题:
xcape二进制文件的完整路径:ExecStart=/full/path/to/bin/xcape -e ...$PATH:
a. Environment="PATH=/bin:/sbin:/nix/var/nix/profiles/default/bin:..."
b. EnvironmentFile=/etc/myservice/myenvfile,其中/etc/myservice/myenvfile包含环境变量的定义(关于这两个指令的文档,请参见systemd.exec(5) )https://stackoverflow.com/questions/60977834
复制相似问题