No effect when started from systemd service unit
spikespaz opened this issue · 5 comments
I have the following systemd unit:
# /home/jacob/.config/systemd/user/swayidle.service
[Install]
WantedBy=hyprland-session.target
[Service]
Environment=PATH=/nix/store/1b9p07z77phvv2hf6gm9f28syp39f1ag-bash-5.1-p16/bin
ExecStart=/nix/store/0pfw3kry1gj3l6x1rwv6waq0w1wgvv01-swayidle-1.7.1/bin/swayidle timeout 5 'swaylock -f --grace 10'
Type=simple
[Unit]
Description=Idle manager for Wayland
Documentation=man:swayidle(1)
PartOf=graphical-session.target
I can confirm that it starts successfully.
I have the following lines in my config for the Hyprland window manager:
exec-once=export XDG_SESSION_TYPE=wayland
exec-once=/nix/store/h3i7qlla1isix0vbw1j9d3v0a7qjrds4-dbus-1.14.0/bin/dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY HYPRLAND_INSTANCE_SIGNATURE XDG_CURRENT_DESKTOP
exec-once=systemctl --user start hyprland-session.target
Hopefully they are self-explanatory. The second line should have set any environment variables for swayidle, but I can see that it only cares about XDG directories according to the source code.
Note that when I run that command that is in the unit directly in the command line, it executes the swaylock command after 5 seconds as expected.
Does systemctl --user show-environment
include WAYLAND_DISPLAY
? What about XDG_SESSION_ID
?
I can confirm they are set. I do not have access to the system at the moment but @fufexan can also verify.
@spikespaz try adding {pkgs.swaylock}/bin
to the Environment
PATH
, or manually using "${pkgs.swaylock}/bin/swaylock"
. SystemD services do not inherit the user PATH.
Using the above works for me.
@spikespaz try adding
{pkgs.swaylock}/bin
to theEnvironment
PATH
, or manually using"${pkgs.swaylock}/bin/swaylock"
. SystemD services do not inherit the user PATH.Using the above works for me.
Alternatively, if you're configuring the service from a central location (as with NixOS or home-manager), you could instead hard-code the binary path. I personally have my exec statement like
ExecStart=${pkgs.swayidle}/bin/swayidle timeout 5 '${pkgs.swaylock}/bin/swaylock --daemonize'
It's probably a more "declarative" way, since that way it doesn't rely on PATH
.
@houstdav000 That's what I'm currently doing.
Fufexan's suggestion was to add the binary to PATH
only for the systemd unit. It won't affect anything else.