我想设置一项systemd
服务来在插入蓝牙键盘时设置自定义键盘映射。我正在使用inputplug
,按照建议这里。
因为我需要一个不包含空格的可执行命令(请参阅这里,选项-c
),我编写了一个可执行的包装脚本:
/home/maddin/.local/bin/setmykeymap
:
#!/bin/sh
setxkbmap us-de
inputplug
现在,如果我在终端中执行,无论我是否使用,一切都会按预期工作sudo
。
$ [sudo] /usr/bin/inputplug -c /home/maddin/.local/bin/setmykeymap
Linked without daemon(), running in foreground.
它确实在连接到我的键盘时设置了我的键盘布局。无论我是否使用,消息都是一样的-d
。我想原因是我在终端中运行它并且以某种方式检测到。
到目前为止,一切都很好。
现在我已经设置了一个systemd
服务,如下本指南。我看起来像这样
/etc/systemd/system/inputplug-keymap-daemon.service
::
[Unit]
Description=Sets xkbmap to us-de anytime a device is plugged or unplugged
[Service]
Type=simple
ExecStart=/usr/bin/inputplug -c /home/maddin/.local/bin/setmykeymap
Restart=on-failure
RestartSec=10
KillMode=mixed
[Install]
WantedBy=multi-user.target
启用服务并重新启动后,我得到:
$ sudo systemctl status inputplug-keymap-daemon.service
● inputplug-keymap-daemon.service - Sets xkbmap to us-de anytime a device is plugged or unplugged
Loaded: loaded (/etc/systemd/system/inputplug-keymap-daemon.service; enabled; vendor preset: disabled)
Active: activating (auto-restart) (Result: exit-code) since Tue 2021-01-19 13:26:48 CET; 1s ago
Process: 74130 ExecStart=/usr/bin/inputplug -c /home/maddin/.local/bin/setmykeymap (code=exited, status=1/FAILURE)
Main PID: 74130 (code=exited, status=1/FAILURE)
我究竟做错了什么?
您会为这样的服务设置哪个Wants
、After
等等?WantedBy
答案1
根据您的评论,您已经解决了导致203
.现在你有错误代码1
。这来自应用程序本身。
监视journalctl -u inputplug-keymap-daemon.service
以查看应用程序是否正在向 stdout 或 stderr 写入任何内容。将 -v 添加到命令行参数可能有助于获取更多信息。
当我看着手册页,很明显这个应用程序使用了DISPLAY
环境变量。这不是系统守护进程通常可以使用的东西,也是我对失败原因的猜测。
一旦我们处理需要访问DISPLAY
和 的服务XAUTHORITY
,我们通常就在用户领域工作。这意味着这是系统本身运行不需要的东西,它是特定于用户及其图形会话的东西。在这种情况下我们使用--user
systemd的总线。总线--user
将使您的服务能够访问您的环境,包括DISPLAY
.
为了使这项工作有效:
sudo systemctl disable inputplug-keymap-daemon.service
cp /etc/systemd/system/inputplug-keymap-daemon.service ~/.config/systemd/user/
sudo rm /etc/systemd/system/inputplug-keymap-daemon.service
systemctl --user start inputplug-keymap-daemon.service
sudo
请注意最后一行中缺少。用systemctl --user status ...
和检查它journalctl --user -u inputplug-keymap-daemon.service
如果有效,请[Install]
在启用该服务之前更改您的部分:
[Install]
WantedBy=default.target
现在你可以systemctl --user enable inputplug-keymap-daemon.service