GUI apps with systemd
This commit is contained in:
parent
6b1133b4d4
commit
59fb8f957d
12
Makefile
12
Makefile
|
@ -5,18 +5,20 @@ source_files := $(shell find content/*.md)
|
||||||
target_files := $(patsubst content/%.md,gemini/%.gmi,$(source_files))
|
target_files := $(patsubst content/%.md,gemini/%.gmi,$(source_files))
|
||||||
|
|
||||||
.PHONY: default
|
.PHONY: default
|
||||||
default: publish build-html
|
default: publish-gemini build-html
|
||||||
|
|
||||||
gemini/%.gmi: content/%.md
|
gemini/%.gmi: content/%.md
|
||||||
lowdown -tgemini $< > $@
|
lowdown -tgemini $< > $@
|
||||||
|
|
||||||
.PHONY: build-gemini
|
gemini/index.gmi: $(source_files)
|
||||||
build-gemini: $(target_files)
|
|
||||||
cp gemini/_index.gmi gemini/index.gmi
|
|
||||||
for file in $(target_files) ; do \
|
for file in $(target_files) ; do \
|
||||||
echo "=> $$file" | sed 's/gemini//' >> gemini/index.gmi ; \
|
echo "=> $$file" | sed 's/gemini//' >> gemini/index.gmi ; \
|
||||||
done
|
done
|
||||||
|
|
||||||
|
.PHONY: build-gemini
|
||||||
|
build-gemini: $(target_files) gemini/index.gmi
|
||||||
|
cp gemini/_index.gmi gemini/index.gmi
|
||||||
|
|
||||||
.PHONY: build-html
|
.PHONY: build-html
|
||||||
build-html:
|
build-html:
|
||||||
boot publish
|
boot publish
|
||||||
|
@ -26,5 +28,5 @@ clean:
|
||||||
echo ${target_files}
|
echo ${target_files}
|
||||||
|
|
||||||
.PHONY: publish
|
.PHONY: publish
|
||||||
publish: $(target_files)
|
publish-gemini: $(target_files) gemini/index.gmi
|
||||||
rsync -av content/img content/extra gemini/index.gmi $^ gemini.bgenc.net:/var/gemini/
|
rsync -av content/img content/extra gemini/index.gmi $^ gemini.bgenc.net:/var/gemini/
|
||||||
|
|
91
content/running-graphical-user-services-with-systemd.md
Normal file
91
content/running-graphical-user-services-with-systemd.md
Normal file
|
@ -0,0 +1,91 @@
|
||||||
|
---
|
||||||
|
title: Running graphical user services with systemd
|
||||||
|
date: 2022-03-18
|
||||||
|
---
|
||||||
|
|
||||||
|
> This post is day 3 of me taking part in the
|
||||||
|
> [#100DaysToOffload](https://100daystooffload.com/) challenge.
|
||||||
|
|
||||||
|
I've recently switched from KDE Plasma to sway as my window manager. I had a problem with the change though: the amazing kdeconnect service weren't working!
|
||||||
|
|
||||||
|
My first attempt at fixing this was to just add a lines into sway config to launch it along with sway.
|
||||||
|
|
||||||
|
```
|
||||||
|
exec /usr/lib/kdeconnectd
|
||||||
|
```
|
||||||
|
|
||||||
|
Looks simple enough. But for some reason, `kdeconnectd` would just disappear
|
||||||
|
after a while. It would appear to run at startup, and then an hour or two later
|
||||||
|
I pull up the kdeconnect app on my phone and it would tell me that my computer
|
||||||
|
is disconnected.
|
||||||
|
|
||||||
|
The biggest issue here was that I had no way to see why kdeconnect had failed.
|
||||||
|
In comes systemd to save the day. Systemd is a service manager, so it will
|
||||||
|
actually maintain the logs for these services. That means if kdeconnect is
|
||||||
|
crashing, I can check the logs for kdeconnect to see why it crashed. I can also
|
||||||
|
configure it to auto-restart after a crash if I want to.
|
||||||
|
|
||||||
|
To launch graphical applications with systemd though, you need to pass the
|
||||||
|
appropriate environment variables to it so it knows how to launch new windows.
|
||||||
|
I added this line to my sway config to do exactly that.
|
||||||
|
|
||||||
|
```
|
||||||
|
# Pass all variables to dbus & systemd to run graphical user services
|
||||||
|
exec dbus-update-activation-environment --all --systemd
|
||||||
|
```
|
||||||
|
|
||||||
|
Next, we need to write a service files to run the application. This is easier
|
||||||
|
than it sounds, here's the service file I wrote for kdeconnect:
|
||||||
|
|
||||||
|
```
|
||||||
|
[Unit]
|
||||||
|
Description=Run kdeconnectd.
|
||||||
|
After=graphical-session.target
|
||||||
|
StartLimitIntervalSec=600
|
||||||
|
StartLimitBurst=5
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=basic
|
||||||
|
ExecStart=/usr/lib/kdeconnectd
|
||||||
|
Restart=on-failure
|
||||||
|
RestartSec=5s
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=graphical-session.target
|
||||||
|
```
|
||||||
|
|
||||||
|
I saved this as `~/.config/systemd/user/kdeconnectd.service`. Finally, enabled it for my user with `systemctl --user enable kdeconnectd.service` and then restarted.
|
||||||
|
|
||||||
|
The service is configured to automatically restart on failure, but not if it
|
||||||
|
failed more than 5 times in the last 10 minutes. Systemd also waits 5 seconds
|
||||||
|
before trying to restart the failed service. This way if it crashes for some
|
||||||
|
reason, it will restart. But if it keeps crashing rapidly, it won't keep
|
||||||
|
trying to restart which could take up too much system resources.
|
||||||
|
|
||||||
|
I can now check how the service is doing with systemd!
|
||||||
|
|
||||||
|
```
|
||||||
|
Warning: The unit file, source configuration file or drop-ins of kdeconnectd.service changed on disk. Run 'systemctl --user daemon-reload>
|
||||||
|
● kdeconnectd.service - Run kdeconnectd.
|
||||||
|
Loaded: loaded (/home/kaan/.config/systemd/user/kdeconnectd.service; enabled; vendor preset: enabled)
|
||||||
|
Active: active (running) since Thu 2022-03-17 14:18:15 EDT; 1h 46min ago
|
||||||
|
Main PID: 2188363 (kdeconnectd)
|
||||||
|
Tasks: 6 (limit: 77007)
|
||||||
|
Memory: 24.2M
|
||||||
|
CPU: 2.440s
|
||||||
|
CGroup: /user.slice/user-1000.slice/user@1000.service/app.slice/kdeconnectd.service
|
||||||
|
└─2188363 /usr/lib/kdeconnectd
|
||||||
|
|
||||||
|
Mar 17 14:20:58 eclipse systemd[817]: /home/kaan/.config/systemd/user/kdeconnectd.service:6: Unknown key name 'type' in section 'Service'>
|
||||||
|
Mar 17 15:16:11 eclipse kdeconnectd[2188363]: QObject::connect(KWayland::Client::Registry, Unknown): invalid nullptr parameter
|
||||||
|
Mar 17 15:16:11 eclipse kdeconnectd[2188363]: kdeconnect.plugin.battery: No Primary Battery detected on this system. This may be a bug.
|
||||||
|
Mar 17 15:16:11 eclipse kdeconnectd[2188363]: kdeconnect.plugin.battery: Total quantity of batteries found: 0
|
||||||
|
Mar 17 15:23:26 eclipse kdeconnectd[2188363]: QObject::connect(KWayland::Client::Registry, Unknown): invalid nullptr parameter
|
||||||
|
Mar 17 15:23:26 eclipse kdeconnectd[2188363]: kdeconnect.plugin.battery: No Primary Battery detected on this system. This may be a bug.
|
||||||
|
Mar 17 15:23:26 eclipse kdeconnectd[2188363]: kdeconnect.plugin.battery: Total quantity of batteries found: 0
|
||||||
|
Mar 17 15:23:26 eclipse kdeconnectd[2188363]: QMetaObject::invokeMethod: No such method KIO::StoredTransferJob::slotDataReqFromDevice()
|
||||||
|
Mar 17 15:24:35 eclipse kdeconnectd[2188363]: QMetaObject::invokeMethod: No such method KIO::StoredTransferJob::slotDataReqFromDevice()
|
||||||
|
Mar 17 15:57:29 eclipse systemd[817]: /home/kaan/.config/systemd/user/kdeconnectd.service:9: Unknown key name 'type' in section 'Service'>
|
||||||
|
```
|
||||||
|
|
||||||
|
A bunch of warnings so far, but no crashes yet. But if it does crash again, I'll finally know why.
|
Loading…
Reference in a new issue