我有一个启动脚本,有时在启动时运行,有时不运行(我不知道为什么)。这对我来说是一个问题,因为脚本会交换键盘上的按键,因此我需要在桌面加载后交换按键。我写了一个systemd
服务,但它不起作用。这是我的服务文件。
# /etc/systemd/system/keySwap.service
[Unit]
Description=Swaps right Option key with Right CMD key
After=display-manager.service
[Service]
ExecStart=/home/jedrek/keyboard_keys_swapper.sh
[Install]
WantedBy=default.target
当我在图形环境的终端中手动运行该服务时,它会出错。
sudo systemctl start keySwap
sudo systemctl status keySwap
● keySwap.service - Swaps right Option key with Right CMD key
Loaded: loaded (/etc/systemd/system/keySwap.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Tue 2022-04-05 18:57:24 CEST; 4s ago
Process: 12028 ExecStart=/home/jedrek/keyboard_keys_swapper.sh (code=exited, status=1/FAILURE)
Main PID: 12028 (code=exited, status=1/FAILURE)
kwi 05 18:57:24 Home systemd[1]: Started Swaps right Option key with Right CMD key.
kwi 05 18:57:24 Home keyboard_keys_swapper.sh[12029]: xmodmap: unable to open display ''
kwi 05 18:57:24 Home keyboard_keys_swapper.sh[12030]: xmodmap: unable to open display ''
kwi 05 18:57:24 Home systemd[1]: keySwap.service: Main process exited, code=exited, status=1/FAILURE
kwi 05 18:57:24 Home systemd[1]: keySwap.service: Failed with result 'exit-code'.
shell 脚本只是交换键:
#!/bin/bash
xmodmap -e "keycode 108 = Super_R"
xmodmap -e "keycode 134 = ISO_Level3_Shift"
我知道这xmodmap
需要加载图形桌面,所以我不明白为什么它不起作用。我该如何解决我的问题?
答案1
所有 X 程序都需要知道要与哪个显示器进行通信,并且它们通过DISPLAY
环境变量来完成此操作。当您的图形桌面中运行终端时,您可以看到该值是什么:echo $DISPLAY
它通常只是:0
翻译为当前主机上的第一个显示,因此您可以通过添加一行内容在脚本中设置它export DISPLAY=:0
,并且它可能会起作用。
所以这可能会让你继续...
但是,您可能需要重新考虑该计划。正如所写的,systemd 单元文件只会重新开始,因为一旦执行 xmodmap 操作,脚本就会退出。最好将Type=oneshot
其与 一起编写为服务RemainAfterExit=true
。由于您确实希望在下次启动时重新启动它,因此您需要通过使其与显示管理器关闭目标(plymouth-quit.service
在我的基于 gnome 的系统上)冲突来终止它。你可以看到这变得有点复杂。
如果您坚持使用 systemd 方法,最简单的方法可能是ExecStartPost
向display-manager.service
via添加额外的操作systemctl edit display-manager.service
。
但我认为最好的方法是找出显示管理器在启动时使用哪些文件并修改这些文件来运行脚本。我认为 systemd 对于这样的本地更改来说太重了。
答案2
一般来说,systemd 服务不适合对 X11 执行任何操作。这应该在提供登录提示之前初始化显示的脚本中完成,或者作为用户会话启动脚本的一部分完成。
此外,xmodmap 似乎是一种过时的更改键绑定的方法,因为国际化工具还会重新映射键盘,并且任何使用 xmodmap 的尝试最多都是暂时的,因为 I18n 工具将随时重新映射键盘并擦除 xmodmap 更改当屏幕锁定或解锁时以及用户 GUI 会话管理器重新初始化时,键盘会发生变化。