討論這篇「如何讓gcin開機後不多次執行」 [論壇 - Ubuntu 與中文]


正在瀏覽:   1 名遊客


 到底部   前一個主題   下一個主題  [無發表權] 請登錄或者註冊



討論這篇「如何讓gcin開機後不多次執行」
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 37
HP : 0 / 905
MP : 679 / 30304
EXP: 23
離線
PS: 剛重新做實驗,有新發現,以下有些說法,可能會導致誤導,請搭配「#6」的說明。

========================================

剛看到這篇「如何讓gcin開機後不多次執行」,做了一些探索,

還沒研究透徹,先紀錄目前發現到的一些線索。

我知道該篇參與討論的人,也會來這裡觀看,
我懶得再申請那裡的帳號,也想在這裡討論,
所以先說聲「歹勢」,我就直接在這回覆了。
(後來有發現,有Guest發言的機制,所以就留下連結,連回這裡了)

以下測試環境,「Ubuntu 16.04 (64位元) 英文界面」。

我一開始有用之前trace過「im-config」和「fcitx」的流程,再trace一遍
那個第一個process「/usr/bin/gcin」應該是從「/usr/share/im-config/data/26_gcin.rc」執行的。
所以我先把「/usr/share/upstart/sessions/im-config.conf」拿掉,這樣就不會跑第一個「/usr/bin/gcin」了。

不過第二個Process 的「gcin」,重開機還是會跑出來。
所以我想了一個土法煉鋼的方法,寫了一個「shell script」來取代「/usr/bin/gcin」,來找線索。
若其他大德有比較好trace的方法,煩請不吝提供,感恩先,小弟不才,目前只會這個方式。
而我也不懂im的相關技術和概念,我只能就目前會的來提出,歹勢拉!

使用「bash who call」當關鍵字查詢,
找到「一篇參考文章」。

簡單寫了scirpt,內容如下


#!/usr/bin/env bash

LOG_FILE=$HOME/trace.txt

echo '==================' >> $LOG_FILE

PARENT_COMMAND="$(ps -o comm= $PPID)"
echo $PARENT_COMMAND >> $LOG_FILE

echo '------------------' >> $LOG_FILE

PARENT_COMMAND="$(ps -o comm=$PPID)"
echo $PARENT_COMMAND >> $LOG_FILE

echo '==================' >> $LOG_FILE




然後重開機,就會看到類似如下面的log


==================

------------------
1113 systemd (sd-pam) upstart upstart-udev-br sh sleep dbus-daemon sh sh sh window-stack-br gpgconf gnome-keyring-d bash gnome-keyring-d gpg-connect-age upstart-dbus-br upstart-dbus-br upstart-file-br ps
==================
==================
hud-service
------------------
1180 systemd (sd-pam) upstart upstart-udev-br sh sleep dbus-daemon window-stack-br upstart-dbus-br upstart-dbus-br upstart-file-br gnome-keyring-d gpg-agent bamfdaemon hud-service unity-settings- gvfsd compiz gvfsd-fuse at-spi-bus-laun gnome-session-b unity-panel-ser dbus-daemon at-spi2-registr gnome-screensav dconf-service bash ps
==================



然後執行


$ ps 1180



顯示


PID TTY STAT TIME COMMAND
1180 ? Ssl 0:00 /usr/lib/x86_64-linux-gnu/hud/hud-service



執行


dpkg -S /usr/lib/x86_64-linux-gnu/hud/hud-service



顯示


hud: /usr/lib/x86_64-linux-gnu/hud/hud-service



也就是「/usr/lib/x86_64-linux-gnu/hud/hud-service」是屬於「hud」這個套件


然後執行下面指令,觀看「hud」這個套件,有那些檔案安裝在系統上。


$ dpkg -L hud



顯示


/.
/etc
/etc/apport
/etc/apport/crashdb.conf.d
/etc/apport/crashdb.conf.d/hud-crashdb.conf
/usr
/usr/lib
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/hud
/usr/lib/x86_64-linux-gnu/hud/dbus-activation-hack.sh
/usr/lib/x86_64-linux-gnu/hud/hud-service
/usr/lib/x86_64-linux-gnu/hud/window-stack-bridge
/usr/share
/usr/share/apport
/usr/share/apport/package-hooks
/usr/share/apport/package-hooks/source_hud.py
/usr/share/dbus-1
/usr/share/dbus-1/interfaces
/usr/share/dbus-1/interfaces/com.canonical.hud.xml
/usr/share/dbus-1/interfaces/com.canonical.hud.query.xml
/usr/share/dbus-1/services
/usr/share/dbus-1/services/com.canonical.hud.service
/usr/share/doc
/usr/share/doc/hud
/usr/share/doc/hud/copyright
/usr/share/doc/hud/changelog.Debian.gz
/usr/share/upstart
/usr/share/upstart/sessions
/usr/share/upstart/sessions/window-stack-bridge.conf
/usr/share/upstart/sessions/hud.conf
/usr/share/glib-2.0
/usr/share/glib-2.0/schemas
/usr/share/glib-2.0/schemas/com.canonical.indicator.appmenu.hud.gschema.xml
/usr/share/glib-2.0/schemas/com.canonical.indicator.appmenu.hud.search.gschema.xml




然後來做個小實驗(以下非解法)

把「/usr/share/upstart/sessions/hud.conf」和「/usr/share/dbus-1/services/com.canonical.hud.service」這兩個檔移走。



$ sudo mv /usr/share/upstart/sessions/hud.conf ~/
$ sudo mv /usr/share/dbus-1/services/com.canonical.hud.service ~/



然後重開機,就會發現第二個Process的「gcin」,就不會再出現了。

剩下的沒再深究了,先紀錄到此,其他有了解的人,歡迎加入討論,感恩。

因為有些疑問,待研究的

* 就是直接下指令執行gcin,好像會被檔掉,不允許重複執行,所以就不確定怎麼的方式才能重複執行。
* 「hud」這個套件,那一段流程會跑「im (gcin)」? (這個不確定,我要重灌再試試,是否真的跟這個套件有關)
* 另外開軟體,也會跑「im (gcin)」,
例如「firefox」或「gonome-terminal」,這個在log都會跑出來,剛log只有列一開機的時候。
所以我測試的時候,使用「Xterm」來打指令。又想起「這篇討論 (#28)」了,Orz...




報告完畢




額外一提一個輔助指令「pstree」。

可以執行下面指令看顯示結果


$ pstree




另外裡面提到的「/proc」,可以執行下面指令,找到相關說明

$ man 5 proc


我先來複習研讀「鳥哥的 Linux 私房菜 / 第十六章、程序管理與 SELinux 初探」好了 :p

2016/8/2 17:53
應用擴展 工具箱
回覆: 討論這篇「如何讓gcin開機後不多次執行」
會員四級
註冊日期:
2015/9/29 21:19
所屬群組:
已註冊使用者
等級: 16
HP : 0 / 380
MP : 100 / 8913
EXP: 22
離線
我比較想知道的是
套件依賴, 有沒有類似 pstree
可以在終端機列出樹狀檢視的指令


例如: 套件 bumblebee 依賴有 libbsd0 libc6 libglib2.0-0 ...

然後在終端機顯示 bumblebee 依賴套件的樹狀圖變成:

bumblebee
        ├─ libbsd0
        ├─ libc6
        └─ libglib2.0-0


類似這樣的指令

2016/8/2 18:59
應用擴展 工具箱
回覆: 討論這篇「如何讓gcin開機後不多次執行」
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 37
HP : 0 / 905
MP : 679 / 30304
EXP: 23
離線
姜至奐 寫到:
我比較想知道的是
套件依賴, 有沒有類似 pstree
可以在終端機列出樹狀檢視的指令


例如: 套件 bumblebee 依賴有 libbsd0 libc6 libglib2.0-0 ...

然後在終端機顯示 bumblebee 依賴套件的樹狀圖變成:

bumblebee
        ├─ libbsd0
        ├─ libc6
        └─ libglib2.0-0


類似這樣的指令


我也蠻想知道的,因為之前「有一篇討論」,我有這樣的需求。

所以那時候有使用「apt-get debug dependencies」,找到「一篇文章」,

我當時有使用該篇提到的技巧,來找線索。

您可以參考看看,不過裡面提到的技巧,應該沒我們預期想要的樹狀圖就是了。


2016/8/2 19:33
應用擴展 工具箱
回覆: 討論這篇「如何讓gcin開機後不多次執行」
管理員
註冊日期:
2011/3/11 6:32
所屬群組:
討論區管理群
等級: 44
HP : 216 / 1084
MP : 1088 / 39829
EXP: 38
離線

2016/8/2 23:22
本篇發表文章以「創用CC BY 3.0 或更新之台灣地區版本」授權條款釋出,如何使用敬請參考
 Creative Commons — 姓名標示 3.0 台灣 — CC BY 3.0 TW
 http://creativecommons.org/licenses/by/3.0/tw/

「你不懂的東西就不要亂講,被懂得人看破手腳就算了,騙不懂的人誤導別人,還要別人把你當成大師,這就真的是說不過去了。」
 by Allen Own
 出處 http://www.plurk.com/p/i4uogm

自由知識創作平台介紹
 https://docs.google.com/document/d/1MGG6lW_0qCgH4U785R-IwSc_INdoBGej1l-JxiA4gPE
如何建立新的自由知識創作平台文件
 https://docs.google.com/document/d/11NdzOW2lGYksfyQIcPMPye5tlmj1J0QTkgPTmQvIvKA
應用擴展 工具箱
回覆: 討論這篇「如何讓gcin開機後不多次執行」
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 37
HP : 0 / 905
MP : 679 / 30304
EXP: 23
離線

2016/8/3 10:03
應用擴展 工具箱
回覆: 討論這篇「如何讓gcin開機後不多次執行」
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 37
HP : 0 / 905
MP : 679 / 30304
EXP: 23
離線
今天使用全新系統來重新測試,有新的發現

測試環境跟上面一樣是「Ubuntu 16.04 (64位元) 英文界面」。

然後這次測試有一個要特別注意的事項,上面最後有稍微提到,

就是「下指令」的時候,要用「xterm」來測試,不要用「gnome-terminal」,因為這會影響測試結果。

為了測試方便,先把下面幾個程式「Lock to Launcher」,

* xterm
* gnome-terminal
* gedit



上面取代「/usr/bin/gcin」的「scirpt」稍微再改寫一下,內容如下

主要多加了紀錄「$XMODIFIERS」當下的值。


#!/usr/bin/env bash

LOG_FILE=$HOME/trace.txt

echo >> $LOG_FILE

echo '==================' >> $LOG_FILE
echo '{' >> $LOG_FILE

PARENT_COMMAND="$(ps -o comm= $PPID)"
echo $PARENT_COMMAND >> $LOG_FILE

echo '------------------' >> $LOG_FILE

echo $XMODIFIERS >> $LOG_FILE

echo '------------------' >> $LOG_FILE

PARENT_COMMAND="$(ps -o comm=$PPID)"
echo $PARENT_COMMAND >> $LOG_FILE

echo '}' >> $LOG_FILE

echo '==================' >> $LOG_FILE




然後重開機,再測試。

觀看「~/trace.txt」內容,

顯示如下,



==================
{

------------------
@im=gcin
------------------
1063 systemd (sd-pam) upstart sh upstart-udev-br sleep dbus-daemon sh sh sh window-stack-br gpgconf gnome-keyring-d bash gnome-keyring-d gpg-connect-age upstart-dbus-br upstart-dbus-br upstart-file-br ps
}
==================

==================
{
hud-service
------------------
@im=gcin
------------------
1132 systemd (sd-pam) upstart sh upstart-udev-br sleep dbus-daemon window-stack-br upstart-dbus-br upstart-dbus-br upstart-file-br gnome-keyring-d gpg-agent bamfdaemon hud-service unity-settings- gvfsd compiz gvfsd-fuse at-spi-bus-laun gnome-session-b unity-panel-ser dbus-daemon dconf-service at-spi2-registr gnome-screensav start-pulseaudi pactl indicator-messa indicator-bluet indicator-power indicator-datet indicator-keybo indicator-sound indicator-print indicator-sessi pulseaudio indicator-appli pulseaudio pulseaudio pulseaudio dbus-daemon evolution-sourc bash ps
}
==================

==================
{
hud-service
------------------
@im=gcin
------------------
1132 systemd (sd-pam) upstart sh upstart-udev-br sleep dbus-daemon window-stack-br upstart-dbus-br upstart-dbus-br upstart-file-br gnome-keyring-d gpg-agent bamfdaemon hud-service unity-settings- gvfsd compiz gvfsd-fuse at-spi-bus-laun gnome-session-b unity-panel-ser dbus-daemon dconf-service at-spi2-registr gnome-screensav start-pulseaudi pactl indicator-messa indicator-bluet indicator-power indicator-datet indicator-keybo indicator-sound indicator-print indicator-sessi pulseaudio indicator-appli pulseaudio pulseaudio pulseaudio dbus-daemon evolution-sourc pulseaudio bash ps
}
==================



可以先來做一些測試


ps -l 1132
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 1132 978 0 80 0 - 152940 poll_s ? 0:00 /usr/lib/x86_64-linux-gnu/hud/hud-service
ps -l 978
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 1000 978 967 0 80 0 - 11767 poll_s ? 0:00 /sbin/upstart --user
ps -l 967
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 967 735 0 80 0 - 57059 - ? 0:00 lightdm --session-child 11 15
ps -l 735
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 735 1 0 80 0 - 73040 - ? 0:00 /usr/sbin/lightdm
ps -l 1
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 1 80 0 - 29975 - ? 0:04 /sbin/init splash




再來,先啟動「gedit」,

再次觀看「~/tract.txt」,

會發現多了下面的資訊。


==================
{
gedit
------------------
@im=gcin
------------------
1791 systemd (sd-pam) upstart upstart-udev-br dbus-daemon window-stack-br upstart-dbus-br upstart-dbus-br upstart-file-br gnome-keyring-d gpg-agent bamfdaemon hud-service unity-settings- gvfsd compiz gvfsd-fuse at-spi-bus-laun gnome-session-b unity-panel-ser dbus-daemon dconf-service at-spi2-registr indicator-messa indicator-bluet indicator-power indicator-datet indicator-keybo indicator-sound indicator-print indicator-sessi indicator-appli pulseaudio evolution-sourc polkit-gnome-au nm-applet gnome-software nautilus evolution-calen unity-fallback- gvfs-udisks2-vo gvfs-afc-volume gvfs-gphoto2-vo gvfs-mtp-volume gvfs-goa-volume gvfsd-trash evolution-calen evolution-addre evolution-calen evolution-addre zeitgeist-datah sh zeitgeist-daemo zeitgeist-fts xterm update-notifier deja-dup-monito unity-scope-hom unity-scope-loa unity-files-dae gedit bash ps
}
==================



可以看到「$XMODIFIERS」的值是「@im=gcin」。

注意上面的資訊,會重複,因為目前「/usr/bin/gcin」改寫成「script」,所以「gcin」這個「process」執行完就離開,所以我猜「xim」的機制會再次呼叫「gcin」,這一段的實做細節我目前還不懂,只有從「這篇 (#28)」的討論看到的概念。

然後執行


$ strings /proc/1791/environ | grep XMODIFIERS



顯示


XMODIFIERS=@im=ibus




然後再開啟「gnome-terminal」

再次觀看「~/tract.txt」,

會發現多了下面的資訊。


==================
{
gnome-terminal-
------------------
@im=ibus
------------------
1820 systemd (sd-pam) upstart upstart-udev-br dbus-daemon window-stack-br upstart-dbus-br upstart-dbus-br upstart-file-br gnome-keyring-d gpg-agent bamfdaemon hud-service unity-settings- gvfsd compiz gvfsd-fuse at-spi-bus-laun gnome-session-b unity-panel-ser dbus-daemon dconf-service at-spi2-registr indicator-messa indicator-bluet indicator-power indicator-datet indicator-keybo indicator-sound indicator-print indicator-sessi indicator-appli pulseaudio evolution-sourc polkit-gnome-au nm-applet gnome-software nautilus evolution-calen unity-fallback- gvfs-udisks2-vo gvfs-afc-volume gvfs-gphoto2-vo gvfs-mtp-volume gvfs-goa-volume gvfsd-trash evolution-calen evolution-addre evolution-calen evolution-addre zeitgeist-datah sh zeitgeist-daemo zeitgeist-fts xterm update-notifier deja-dup-monito unity-scope-hom unity-scope-loa unity-files-dae gedit gnome-terminal gnome-terminal. gnome-terminal- bash ps
}
==================



可以看到「$XMODIFIERS」的值是「@im=ibus」。

然後執行


$ strings /proc/1820/environ | grep XMODIFIERS



顯示


XMODIFIERS=@im=ibus




再來你可以自行測試「firefox」和「nautilus」,
「firefox」是「@im=gcin」,
「nautilus」則是「@im=ibus」。


接下來把「/usr/bin/gcin」還原,再重新測試,
分別執行上面的程式,你就會發現會跑出來「gcin」這個「process」,注意非「/usr/bin/gcin」。

然後你觀看「gcin」的「/proc/$pid/environ」,「gcin」的「XMODIFIERS」會根據該啟動程式的「XMODIFIERS」而定。

我有測試過「Ubuntu 16.04 (64位元) 中文界面」結果也是如此。

而測試「Xubuntu 16.04 (64位元) 英文界面」,上面四個程式結果都是「@im=gcin」,而且不會有重複gcin執行的狀況發生。

====================================================


接下來另一個發現,

因為一直在想,啟動程式,為啥「XMODIFIERS」會被改掉?

所以看到「nautilus」有一些聯想,讓我發現下面的情況,

先執行


$ pstree -n | less



然後找到「nautilus」,會看到掛在「gnome-session-bin」底下。

所以一樣使用上面的方法,觀察「/proc」那,

可以看到「gnome-session-bin」,其「XMODIFIERS」的值是「@im=gcin」。

然後看到掛在「gnome-session-bin」底下的程式,例如「nautilus」,「nm-applet」,其「XMODIFIERS」的值是「@im=ibus」。

至於為啥會如此,尚未探究,先紀錄到此,




2016/8/3 22:36
應用擴展 工具箱
回覆: 討論這篇「如何讓gcin開機後不多次執行」
會員五級
註冊日期:
2012/4/22 10:50
所屬群組:
已註冊使用者
等級: 37
HP : 0 / 905
MP : 679 / 30304
EXP: 23
離線
找到一個線索

執行


$ apt-get source gnome-session-bin



會下載「gnome-session-bin」的「Source Package: gnome-session」,並且解開。


執行


$ grep ibus gnome-session-3.18.1.2/* -R



顯示


gnome-session-3.18.1.2/gnome-session/main.c:                gchar *ibus_path;
gnome-session-3.18.1.2/gnome-session/main.c:                ibus_path = g_find_program_in_path("ibus-daemon");
gnome-session-3.18.1.2/gnome-session/main.c:                if (ibus_path) {
gnome-session-3.18.1.2/gnome-session/main.c:                        gsm_util_setenv ("QT_IM_MODULE", "ibus");
gnome-session-3.18.1.2/gnome-session/main.c:                        gsm_util_setenv ("XMODIFIERS", "@im=ibus");
gnome-session-3.18.1.2/gnome-session/main.c:                g_free (ibus_path);




從「gnome-session-3.18.1.2/gnome-session/main.c」
可以看到一段程式碼如下

(github參考連結)


                gchar *ibus_path;

                ibus_path = g_find_program_in_path("ibus-daemon");

                if (ibus_path) {
                        gsm_util_setenv ("QT_IM_MODULE", "ibus");
                        gsm_util_setenv ("XMODIFIERS", "@im=ibus");
                }

                g_free (ibus_path);



================================================================================

來做個小實驗,

把「/usr/bin/ibus-daemon」移走

重開機,

照上面提的方法,觀看「/proc」那,

分別觀看「gnome-terminal-server(先執行gnome-terminal)」,「nm-applet」,「nautilus」

就可以看到「XMODIFIERS」的值,都是「@im=gcin」。

「gcin」那個「process」也不會再重複跑出來了。


報告完畢



================================================================================

## 相關討論

* unity panel 出現兩組gcin icons
* 如何讓gcin開機後不多次執行
* gcin ubuntu 1604 unity <-- 結論在此討論串的回覆#2
* 砍掉gcin後會自動執行?

* 回覆: 新手求解 ubuntu gnome 已安裝gcin 卻無法使用
* 回覆: 裝了 ubuntu 16.04 lts 64位元版 一直無法輸入中文

## 實驗專案

簡單寫了兩個「shell script」,可以幫助了解相關的執行模型。

================================================================================

後記 (2017-03-09): 這個問題,後來的版本應該是有被修正了,請參考「這篇」。

後記 (2022-05-24): 若ibus同時存在,如何解決?

================================================================================


2016/8/3 23:59
應用擴展 工具箱
回覆: 討論這篇「如何讓gcin開機後不多次執行」
會員二級
註冊日期:
2013/11/7 9:24
所屬群組:
已註冊使用者
等級: 8
HP : 0 / 187
MP : 30 / 5440
EXP: 51
離線
幾乎已經確認在16.04+gcin 2.8.4版的組合下,會出現上面討論的主題---多個gcin的process。

由於開發者釋出gcin 2.8.5,於是立馬將它重新編譯後測試,這個問題完全消失了!不知是不是這個版本的修正還是其它的原因?

有一樣問題的人可以嘗試看看,這樣也好確認是不是和我的情況一樣!如果是的話就解決了這一個長久以來的問題!至少,我目前是用得非常好,再也不會因為這個問題而造成gcin不定時掛掉的情況!

2017/2/23 15:41
應用擴展 工具箱


 [無發表權] 請登錄或者註冊


可以查看帖子.
不可發帖.
不可回覆.
不可編輯自己的帖子.
不可刪除自己的帖子.
不可發起投票調查.
不可在投票調查中投票.
不可上傳附件.
不可不經審核直接發帖.