Ich hab mir eine schwierige Aufgabe gestellt... und jetzt konnte ich sie lösen. Ich bin mir noch nicht ganz sicher, ob die Lösung schön ist... jedenfalls scheint sie zu funktionieren.
Für mein Fuse-Filesystemd, mit dem ich die Drucker aus CUPS in ein Verzeichnis mounte (ein verschieben/kopieren eines Files in ein Verzeichnis für den Drucker löst damit einen Druck des Files aus, weiter nichts - und man sieht mit ls oder tree, was schon alles gedruckt wurde) wollte ich eine von XDG_DESKTOP_DIR abhängige Path-Unit für systemd - und das noch als User-Prozess...
Die Direktive "PathExists=" in der Path-Unit akzeptiert nur vollständige Pfade von / ausgehend (oder die systemd-Variablen %h für $HOME und andere mit % beginnende) und ist damit unzugänglich für ${XDG_DESKTOP_DIR}.
Ich möchte mein CupsFS aber flexibel an XDG_DESKTOP_DIR angepasst haben, und durch den User durch erstellen eines entsprechenden Verzeichnisses aktiveren lassen können. (ähnlich wie journald das journal auf die Platte schreibt, sobald das Verzeichnis /var/log/journald vorhanden ist).
Also benötige ich eine Path-Unit, welche von XDG_DESKTOP_DIR abhängig ist... Noch besser... ich lege eine eigene xdg-user-dirs-Variable XDG_PRINTERS_DIR an.
Aber Schritt für Schritt:
Zuerst gibt es eine Service-Unit, welche mir ein Environment festlegt und eine instanziierte Path-Unit aktiviert:
/etc/systemd/user/cups-fuse.service
Code: Alles auswählen
[Unit]
Description=Set XDG_PRINTERS_DIR and XDG_PRINTERS_DIR_SD and start path-unit for cups-fuse
[Service]
ExecStartPre=/bin/sh -c '/bin/systemctl --user set-environment XDG_PRINTERS_DIR=$(xdg-user-dir PRINTERS)'
ExecStartPre=/bin/sh -c '/bin/systemctl --user set-environment XDG_PRINTERS_DIR_SD=$(/bin/systemd-escape -p ${XDG_PRINTERS_DIR})'
ExecStart=/bin/systemctl --user start cups-fuse@${XDG_PRINTERS_DIR_SD}.path
[Install]
WantedBy=paths.target
/etc/systemd/user/cups-fuse@.path
Code: Alles auswählen
[Unit]
Description=Starts mounting printers to %f, if this directory exists
[Path]
PathExists=%f
Unit=cups-fuse@%i.service
/etc/systemd/user/cups-fuse@.service
Code: Alles auswählen
[Unit]
Description=Present directory for each printer in %f
ConditionPathExists=%f
[Service]
ExecStart=/usr/bin/CupsFS.py -f %f
ExecStop=-/bin/fusermount -u %f
Restart=on-success
Zu finden sind diese Units immer am aktuellen Entwicklungsstand incl. deb-Paket auf Github: https://github.com/xundeenergie/fuse-cups.git
lg scientific