D-Bus service activation
當一名程序員實作了一個 daemon 時,他將會面臨一個關於系統啟動流程的問題。他要如何安排啟動流程,才能正常地啟動他的 daemon? 要放在 init.d 嗎?還是放在 rc.local?再者,每種 Linux 或 BSD 系統的啟動流程都有差異,更是為這項工作增加不少負擔。而 D-Bus service 的運作模式基本上也是一個 daemon ,所以當程序員實作了一個 D-Bus service 後,按理也是要為安排啟動流程煩惱。
所幸 D-Bus 有一個 dbus daemon launch helper 的功能,可以免除程序員安排 D-Bus service 啟動程序的困惱。只要按照 D-Bus 規格上說明的方式,寫好 .service 文件,dbus daemon lauhcn helper 就會在使用者呼叫指定 D-Bus service 時,自動啟動該 D-Bus service 程序。程序員不必煩惱 D-Bus service 程序的啟動問題。
Session bus service
Session bus service 是跟隨使用者桌面環境期間的行程,所以它執行時的 UID,GID 為此桌面期間的使用者。
假設有一個 Session bus service ,其 service name 為 blog.rock.Hello ,程式名稱是 /usr/local/bin/HelloService。那麼我們可以編輯一個與 service name 同名的 blog.rock.Hello.service 文件,其內容如下:
#filename: blog.rock.Hello.service [D-BUS Service] Name=blog.rock.Hello Exec=/usr/local/bin/HelloService
最後將此文件複製到 /usr/share/dbus-1/services 目錄下。 Dbus daemon launch helper 就會知道該如何啟動這個程序。
System bus service
System bus service 屬於系統層級的行程,它執行時的預設身份將會是 root ,或者你也可以指定執行身份。因此,dbus daemon lauhcn helper 啟動 System bus service 程序時,比 Session bus service 多了一道安全機制。
假設有一個 System bus service ,其 service name 為 blog.rock.sys ,程式名稱是 /usr/local/bin/rock_sys。那麼我們可以編輯一個與 service name 同名的 blog.rock.sys.service 文件,其內容如下:
#filename: blog.rock.sys.service [D-BUS Service] Name=blog.rock.sys Exec=/usr/local/bin/rock_sys User=root
System bus service 的 .service 文件,多一個 User 欄位,指定此服務行程的身份。
將此文件複製到 /usr/share/dbus-1/system-services 目錄下。
接著,配合 dbus daemon lauhcn helper 啟動 System bus service 程序的安全機制,我們還要新增一份與 service 同名的組態文件。在此例中,此文件名稱是 blog.rock.sys.conf 。最少內容如下:
將此文件複製到 /etc/dbus-1/system.d。安排好這兩份文件後,Dbus daemon launch helper 就會知道該如何啟動這個程序。