14檢查 fcitx5 的啟動機制
🤔 分析:
我們發現 fcitx5 在 10:33:17 過早啟動,但需要確認:是什麼機制啟動了 fcitx5?
$ im-config -m
default fcitx5 ibus ibus
$ cat ~/.xinputrc
# im-config(8) generated on Mon, 22 Sep 2025 10:25:39 +0800 run_im fcitx5 # im-config signature: d0dc02817325a9a408600bd547799708 -
🎯 發現
~/.xinputrc
設定為 run_im fcitx5
,這表示 im-config 框架會在 X session 初始化時自動啟動 fcitx5!
這解釋了為什麼 fcitx5 會在 graphical-session.target 就緒前就啟動。
15檢查是否有 systemd 服務也在管理 fcitx5
$ systemctl --user list-units --all | grep fcitx
fcitx5.service loaded inactive dead Fcitx5 Input Method
$ systemctl --user cat fcitx5.service
[Unit] Description=Fcitx5 Input Method PartOf=graphical-session.target After=graphical-session.target Wants=graphical-session.target [Service] ExecStart=/usr/bin/fcitx5 ...
🎯🎯🎯 真正的根本原因
系統中存在兩種啟動 fcitx5 的機制:
- im-config(傳統方式):透過
~/.xinputrc
在 X session 早期啟動 - systemd 服務(現代方式):透過
fcitx5.service
在 graphical-session.target 後啟動
問題:im-config 的啟動時機太早(10:33:17),在 graphical-session.target 就緒前(10:33:19),導致 fcitx5 請求 portal 時觸發競態條件!
16驗證修復方案
$ im-config -n none
設定 im-config 不自動啟動任何輸入法
$ cat ~/.xinputrc
# im-config(8) generated on Fri, 10 Oct 2025 13:01:31 +0800 run_im none # im-config signature: 0a0fbfefedad5558a9e9e2919b262f89 -
🤔 修復邏輯:
禁用 im-config 自動啟動後,fcitx5 只會透過 systemd 服務在正確時機(graphical-session.target 之後)啟動,避免競態條件。
17系統重啟後驗證
$ journalctl --user -b 0 | grep -E "fcitx5|graphical-session.target|xdg-desktop-portal" | head -15
Oct 10 13:03:34 systemd: Reached target graphical-session.target ⬅️ 先就緒 Oct 10 13:03:34 systemd: Starting fcitx5.service ⬅️ 後啟動 Oct 10 13:03:34 systemd: Started fcitx5.service Oct 10 13:03:34 dbus-daemon: Activating via systemd: xdg-desktop-portal Oct 10 13:03:34 systemd: Starting xdg-desktop-portal-gnome.service Oct 10 13:03:34 systemd: Started xdg-desktop-portal-gnome.service ⬅️ 成功! Oct 10 13:03:34 systemd: Started xdg-desktop-portal.service
$ journalctl --user -b 0 | grep -i "gnome-terminal\|timeout"
Oct 10 13:03:39 dbus-daemon: Activating via systemd: org.gnome.Terminal Oct 10 13:03:39 systemd: Starting gnome-terminal-server.service Oct 10 13:03:39 systemd: Started gnome-terminal-server.service ⬅️ 立即啟動,無逾時!
✅ 修復成功驗證!
正確的啟動順序:
- 13:03:34 - graphical-session.target 就緒
- 13:03:34 - fcitx5.service 啟動(在 target 之後)
- 13:03:34 - xdg-desktop-portal-gnome 成功啟動
- 13:03:39 - gnome-terminal 立即啟動(無逾時)
問題完全解決!
完整的解決方案
永久修復步驟
步驟 1:禁用 im-config 自動啟動
$ im-config -n none
步驟 2:建立/更新 systemd 使用者服務
mkdir -p ~/.config/systemd/user cat > ~/.config/systemd/user/fcitx5.service << 'EOF' [Unit] Description=Fcitx5 Input Method Documentation=man:fcitx5(1) PartOf=graphical-session.target After=graphical-session.target Wants=graphical-session.target [Service] Type=simple ExecStart=/usr/bin/fcitx5 ExecStartPost=/usr/bin/dbus-update-activation-environment --systemd GTK_IM_MODULE=fcitx QT_IM_MODULE=fcitx XMODIFIERS=@im=fcitx Restart=on-failure RestartSec=3 [Install] WantedBy=graphical-session.target EOF systemctl --user daemon-reload systemctl --user enable fcitx5.service
步驟 3:重新啟動系統
關鍵說明:
After=graphical-session.target
確保在圖形工作階段就緒後才啟動ExecStartPost
設定環境變數,讓應用程式能使用 fcitx5- 移除
-d --replace
參數,因為 systemd 會管理程序
沒有留言:
張貼留言