Запустите сессионную шину DBus с помощью Perl Net :: DBus - PullRequest
2 голосов
/ 23 июля 2011

Я использую Perl и модуль Net :: DBus .Я написал простую тестовую программу:

#!/usr/bin/perl
use strict;
use warnings;

package MyObj;
use Net::DBus::Exporter qw(org.example.Tao);
use base qw(Net::DBus::Object);

sub new {
    my $class = shift;
    my $service = shift;
    my $self = $class->SUPER::new($service, '/MyObj');
    bless $self, $class;
    return $self;
}

dbus_method("Hello", ["string"]);

sub Hello {
    return 'Hello';
}

package main;
use Net::DBus;
use Net::DBus::Reactor;

my $bus = Net::DBus->session;
my $service = $bus->export_service("org.example.Tao");
my $object = MyObj->new($service);
my $reactor = Net::DBus::Reactor->main();
$reactor->run();

return 0;

Я подключаюсь по ssh и использую:

Perl, v5.8.8 built for x86_64-linux-thread-multi
Linux example.com 2.6.32.19-0.2.99.17.22250fd-xen #1 SMP 2010-09-13 10:16:50 +0200 x86_64 x86_64 x86_64 GNU/Linux
CentOS release 5.4 (Final)

Когда я пытаюсь запустить test.pl, я получаю ошибку:

org.freedesktop.DBus.Error.Spawn.ExecFailed:
Failed to execute dbus-launch to autolaunch D-Bus session

Эта ошибка возникает в этой строке:

my $bus = Net::DBus->session;

Google намекнул мне о dbus-launch.Я выполнил yum install dbus-x11.

Я пытаюсь снова запустить свой тестовый код и получить ошибку в той же строке:

org.freedesktop.DBus.Error.Spawn.ExecFailed: 
dbus-launch failed to autolaunch D-Bus session: 
Autolaunch error: X11 initialization failed.

После прочтения руководств я обнаружил, что демон сеанса DBUS не запущени мой ENV var DBUS_SESSION_BUS_ADDRESS пуст:

[root@zion perl]# ps ax|grep dbus|grep -v grep
1019 ?        Ss     0:00 dbus-daemon --system

Тогда я исполняю:

[root@zion perl]# dbus-launch --sh-syntax
DBUS_SESSION_BUS_ADDRESS='unix:abstract=/tmp/dbus-smHadq6yxV,guid=101ccd74fb75ae501485ed004e2a9043';
export DBUS_SESSION_BUS_ADDRESS;
DBUS_SESSION_BUS_PID=5037;
[root@zion perl]# ps ax|grep dbus|grep -v grep
1019 ?        Ss     0:00 dbus-daemon --system
5037 ?        Ss     0:00 /bin/dbus-daemon --fork --print-pid 4 --print-address 6 --session

Но DBUS_SESSION_BUS_ADDRESS такой же пустой.

Вопрос: мне нужны два простых приложения на Perl,Первое приложение регистрирует сервис сеанса dbus.Другое приложение, использующее мой зарегистрированный сервис.Каков наилучший и правильный способ сделать это в моей среде?

1 Ответ

2 голосов
/ 01 августа 2011

Прежде всего, вам нужно eval вывод dbus-launch. Как это:

$ env | grep DBUS
(empty output; no DBUS session bus launched yet)
$ eval `dbus-launch --sh-syntax`
(empty output; DBUS session bus started, output is evaluated to set shell vars)
$ env | grep DBUS
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-ZkMjn6B47b,guid=85b2da814a8a061d4e7a55004e35b499

Во-вторых, вы должны подумать, как вы собираетесь использовать свои приложения. Постарайтесь ответить себе на следующие вопросы: почему вы пытаетесь привязаться к шине сеанса (которая по определению является шиной, связанной с интерактивным сеансом пользователя)? Если это общесистемный сервис, он должен быть привязан к системной шине. Если это пользовательская служба, менеджер сеансов пользователей должен позаботиться о запуске шины сеанса dbus.

...