2012-12-12 29 views
7

Tôi có một dịch vụ .service cho một quá trình mà tôi không muốn khởi động lúc khởi động, nhưng gọi nó bằng cách nào đó từ một ứng dụng đang chạy khác, thời gian cho đi.Bắt đầu dịch vụ systemd từ ứng dụng C/C++ hoặc gọi dịch vụ D-Bus

Tùy chọn khác sẽ là đặt một tập tin dịch vụ D-Bus (tôi đang sử dụng glib dbus trong ứng dụng của tôi) vào/usr/share/dbus-1/services và bằng cách nào đó gọi nó từ ứng dụng của tôi. Ngoài ra, tôi cũng không thể làm điều này.

Hãy nói rằng tập tin dịch vụ dbus tôi từ /usr/share/dbus-1/servicescom.callThis.service và tập tin dịch vụ chính của tôi từ /lib/systemd/system is com.startThis.service

Nếu tôi chạy một nội quan đơn giản từ dòng lệnh:

/home/root # dbus-send --session --type=method_call --print-reply \ 
--dest=com.callThis /com/callThis org.freedesktop.DBus.Introspectable.Introspect 

tập tin dịch vụ D-Bus sẽ được gọi và nó sẽ bắt đầu những gì có trong Exec (com.starThis). Vấn đề là tôi muốn đạt được điều này từ mã C/C++ sử dụng D-Bus glib.

+0

Bạn đã cố gắng triển khai? Hiển thị một số bước đầu tiên bạn đã làm. Rất nhiều tài liệu và thậm chí có thể tìm thấy một ví dụ http://developer.gnome.org/gio/2.30/GDBusConnection.html – drahnr

+1

http://www.freedesktop.org/wiki/Software/systemd/dbus/ Đây là thông tin về API DBUS của 'systemd' –

Trả lời

0

Tôi gặp khó khăn khi làm điều tương tự. Khám phá: G_BUS_NAME_WATCHER_FLAGS_AUTO_START giải quyết.

g_bus_watch_name(G_BUS_TYPE_SYSTEM, "com.mydbus.listen", 
     G_BUS_NAME_WATCHER_FLAGS_AUTO_START, xOnNameAppeared, xOnNameVanished, 
     this, nullptr);