如何修复运行 inputplug 的 systemd 服务的退出代码 1?

如何修复运行 inputplug 的 systemd 服务的退出代码 1?

我想设置一项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)

我究竟做错了什么?

您会为这样的服务设置哪个WantsAfter等等?WantedBy

答案1

根据您的评论,您已经解决了导致203.现在你有错误代码1。这来自应用程序本身。

监视journalctl -u inputplug-keymap-daemon.service以查看应用程序是否正在向 stdout 或 stderr 写入任何内容。将 -v 添加到命令行参数可能有助于获取更多信息。

当我看着手册页,很明显这个应用程序使用了DISPLAY环境变量。这不是系统守护进程通常可以使用的东西,也是我对失败原因的猜测。

一旦我们处理需要访问DISPLAY和 的服务XAUTHORITY,我们通常就在用户领域工作。这意味着这是系统本身运行不需要的东西,它是特定于用户及其图形会话的东西。在这种情况下我们使用--usersystemd的总线。总线--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

相关内容