2025/10/10

GNOME Terminal 逾時問題 (解決)

 14檢查 fcitx5 的啟動機制

🤔 分析:

我們發現 fcitx5 在 10:33:17 過早啟動,但需要確認:是什麼機制啟動了 fcitx5?

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 的機制:

  1. im-config(傳統方式):透過 ~/.xinputrc 在 X session 早期啟動
  2. 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  ⬅️ 立即啟動,無逾時!
✅ 修復成功驗證!

正確的啟動順序:

  1. 13:03:34 - graphical-session.target 就緒
  2. 13:03:34 - fcitx5.service 啟動(在 target 之後)
  3. 13:03:34 - xdg-desktop-portal-gnome 成功啟動
  4. 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 會管理程序

沒有留言:

張貼留言