Не работает функция g_dbus_proxy_new_for_bus_sync- (не создаётся какой-то прокси).

Для новичков как вообще в Linux, так и в конкретной теме, к которой относится вопрос.

Модератор: Bizdelnick

Аватара пользователя
жучара
Сообщения: 1072
ОС: астралинукс

Не работает функция g_dbus_proxy_new_for_bus_sync- (не создаётся какой-то прокси).

Сообщение жучара »

Друзья! Вот вырожденный код:

Код: Выделить всё

/* main.c */
#include <glib/gstdio.h>
#include <gio/gio.h>

#define DATETIME_DBUS_NAME "org.mate.SettingsDaemon.DateTimeMechanism"
#define DATETIME_DBUS_PATH "/"

int main ()
{
	GError     *error = NULL;
	GDBusProxy *proxy = NULL;

	proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
						       G_DBUS_PROXY_FLAGS_NONE,
						       NULL,
						       DATETIME_DBUS_NAME,
						       DATETIME_DBUS_PATH,
						       DATETIME_DBUS_NAME,
						       NULL,
						       &error);
	if (proxy == NULL)
	{
		g_print ("bad!\n");
	}
	else
	{
		g_print ("good!\n");
	}
}
Компилим в системе A (пояснения позже), там же запускаем:

Shell

$ gcc -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -o main main.c -lgio-2.0 -lglib-2.0
$ ./main
good!
$
Всё хорошо. Теперь запускаем в системе B

Shell

$ ./main
bad!
$
Всё плохо, как видите. Теперь по системам. Обе системы A и B это Debian 12, но собираю в системе A, а работать она должна в системе B. А почему в системе B не собираю- потому, что там будет просить поставить всякую ерунду, сборочные зависимости, графику и всё такое прочее, я остерегаюсь этого делать, всё-таки я работаю в системе B, не хотелось бы её засорять. Да и код простенький, как вы видете, должен перенестись без проблем, но не переносится.

Теперь давайте посмотрим на параметры функции g_dbus_proxy_new_for_bus_sync. Параметры взяты не с потолка, изначально этот код был в пакете mate-panel, который у меня стоит (панель стоит то есть) то есть все параметры должны быть правильными, вот они. Вот код:

Код: Выделить всё

/* values.c */
#include <glib/gstdio.h>
#include <gio/gio.h>

#define DATETIME_DBUS_NAME "org.mate.SettingsDaemon.DateTimeMechanism"
#define DATETIME_DBUS_PATH "/"

int main ()
{
	g_print ("%d\n", G_BUS_TYPE_SYSTEM);
	g_print ("%d\n", G_DBUS_PROXY_FLAGS_NONE);
	g_print ("%s\n", DATETIME_DBUS_NAME);
	g_print ("%s\n", DATETIME_DBUS_PATH);
	g_print ("%s\n", DATETIME_DBUS_NAME);
}
Компилим запускаем:

Shell

$ gcc -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -o values values.c -lgio-2.0 -lglib-2.0
$
$ ./values
1
0
org.mate.SettingsDaemon.DateTimeMechanism
/
org.mate.SettingsDaemon.DateTimeMechanism
$
Единица и ноль это вот и вот. Такими они и должны быть

В общем, надо создать прокси. Спасибо, кто откликнется.
Я просто читаю маны.
Спасибо сказали:
text
Сообщения: 8

Re: Не работает функция g_dbus_proxy_new_for_bus_sync- (не создаётся какой-то прокси).

Сообщение text »

У меня тоже Debian 12, нет ошибки.
Для начала надо бы посмотреть что за ошибка присваивается в error:

Код: Выделить всё

  if (proxy == NULL)
    {
      g_printerr ("Error creating proxy: %s\n", error->message);
      g_error_free (error);
    }
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 1072
ОС: астралинукс

Re: Не работает функция g_dbus_proxy_new_for_bus_sync- (не создаётся какой-то прокси).

Сообщение жучара »

text писал(а):
07.05.2025 08:58
У меня тоже Debian 12, нет ошибки.
Для начала надо бы посмотреть что за ошибка присваивается в error:

Код: Выделить всё

  if (proxy == NULL)
    {
      g_printerr ("Error creating proxy: %s\n", error->message);
      g_error_free (error);
    }

Shell

$ ./main
Error creating proxy: Error calling StartServiceByName for org.mate.SettingsDaemon.DateTimeMechanism: Failed to execute program org.mate.SettingsDaemon.DateTimeMechanism: Permission denied
bad!
$

Shell

$ls -l /usr/share/dbus-1/system-services/org.mate.SettingsDaemon.DateTimeMechanism.service
-rw-r--r-- 1 root root 110 янв 6 2024 /usr/share/dbus-1/system-services/org.mate.SettingsDaemon.DateTimeMechanism.service
$
по последнему выводу- я думаю, у всех так. Только у добрых людей работает, а у меня нет. sudo есть.

Если бы окно какое вылезало для ввода пароля, был бы другой разговор.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
жучара
Сообщения: 1072
ОС: астралинукс

Re: Не работает функция g_dbus_proxy_new_for_bus_sync- (не создаётся какой-то прокси).

Сообщение жучара »

Возникли вопросы, каждый из которых требует отдельного изучения.

1) Грусть заключается в том, что файла org.mate.SettingsDaemon.DateTimeMechanism.service действительно нет- он ищется в этих вот папках:

Shell

man systemd.unit
...
System Unit Search Path
/etc/systemd/system.control/*
/run/systemd/system.control/*
/run/systemd/transient/*
/run/systemd/generator.early/*
/etc/systemd/system/*
/etc/systemd/system.attached/*
/run/systemd/system/*
/run/systemd/system.attached/*
/run/systemd/generator/*
...
/lib/systemd/system/*
/run/systemd/generator.late/*

User Unit Search Path
~/.config/systemd/user.control/*
$XDG_RUNTIME_DIR/systemd/user.control/*
$XDG_RUNTIME_DIR/systemd/transient/*
$XDG_RUNTIME_DIR/systemd/generator.early/*
~/.config/systemd/user/*
$XDG_CONFIG_DIRS/systemd/user/*
/etc/systemd/user/*
$XDG_RUNTIME_DIR/systemd/user/*
/run/systemd/user/*
$XDG_RUNTIME_DIR/systemd/generator/*
$XDG_DATA_HOME/systemd/user/*
$XDG_DATA_DIRS/systemd/user/*
...
/usr/lib/systemd/user/*
$XDG_RUNTIME_DIR/systemd/generator.late/*
Но никак не в папке

Shell

/usr/share/dbus-1/system-services
Почему пути для поиска не совпадают с тем, где файл есть- первый вопрос.

2) org.mate.SettingsDaemon.DateTimeMechanism.service перенесём куда надо:

Shell

$ sudo cp /usr/share/dbus-1/system-services/org.mate.SettingsDaemon.DateTimeMechanism.service /etc/systemd/system/org.mate.SettingsDaemon.DateTimeMechanism.service
$
Снова программу запустим:

Shell

$ ./main
Error creating proxy: Error calling StartServiceByName for org.mate.SettingsDaemon.DateTimeMechanism: Failed to execute program org.mate.SettingsDaemon.DateTimeMechanism: Permission denied
bad!
$
Та же ошибка. А вот интересно, сервис org.mate.SettingsDaemon.DateTimeMechanism.service можно запустить или нет?

Shell

$ sudo systemctl start org.mate.SettingsDaemon.DateTimeMechanism.service
Failed to start org.mate.SettingsDaemon.DateTimeMechanism.service: Unit org.mate.SettingsDaemon.DateTimeMechanism.service has a bad unit file setting.
See system logs and 'systemctl status org.mate.SettingsDaemon.DateTimeMechanism.service' for details.
$
Нельзя. А почему, смотрим:

Shell

$ sudo systemctl status org.mate.SettingsDaemon.DateTimeMechanism.service
○ org.mate.SettingsDaemon.DateTimeMechanism.service
Loaded: bad-setting (Reason: Unit org.mate.SettingsDaemon.DateTimeMechanism.service has a bad unit file setting.)
Active: inactive (dead)

мая 10 04:09:42 debian systemd[1]: /etc/systemd/system/org.mate.SettingsDaemon.DateTimeMechanism.service:1: Unknown section 'D-BUS Service'. Ignoring.
мая 10 04:09:42 debian systemd[1]: org.mate.SettingsDaemon.DateTimeMechanism.service: Service has no ExecStart=, ExecStop=, or SuccessAction=. Refusing.
мая 10 04:09:49 debian systemd[1]: /etc/systemd/system/org.mate.SettingsDaemon.DateTimeMechanism.service:1: Unknown section 'D-BUS Service'. Ignoring.
мая 10 04:09:49 debian systemd[1]: org.mate.SettingsDaemon.DateTimeMechanism.service: Service has no ExecStart=, ExecStop=, or SuccessAction=. Refusing.
мая 10 04:09:49 debian systemd[1]: /etc/systemd/system/org.mate.SettingsDaemon.DateTimeMechanism.service:1: Unknown section 'D-BUS Service'. Ignoring.
мая 10 04:10:06 debian systemd[1]: /etc/systemd/system/org.mate.SettingsDaemon.DateTimeMechanism.service:1: Unknown section 'D-BUS Service'. Ignoring.
мая 10 04:10:06 debian systemd[1]: org.mate.SettingsDaemon.DateTimeMechanism.service: Service has no ExecStart=, ExecStop=, or SuccessAction=. Refusing.
мая 10 04:10:09 debian systemd[1]: /etc/systemd/system/org.mate.SettingsDaemon.DateTimeMechanism.service:1: Unknown section 'D-BUS Service'. Ignoring.
мая 10 04:10:09 debian systemd[1]: org.mate.SettingsDaemon.DateTimeMechanism.service: Service has no ExecStart=, ExecStop=, or SuccessAction=. Refusing.
мая 10 04:10:09 debian systemd[1]: /etc/systemd/system/org.mate.SettingsDaemon.DateTimeMechanism.service:1: Unknown section 'D-BUS Service'. Ignoring.
$
Очень интересно. То есть оно не может распознать секцию 'D-BUS Service'- какого рожна, спрашивается? Вполне себе легальная секция:

Shell

$ man systemd.service

...

For bus-activatable services, do not include a [Install] section in the systemd service file, but use the SystemdService= option in the corresponding DBus service file, for example
(/usr/share/dbus-1/system-services/org.example.simple-dbus-service.service):

[D-BUS Service]
Name=org.example.simple-dbus-service
Exec=/usr/sbin/simple-dbus-service
User=root
SystemdService=simple-dbus-service.service

$
Кстати, файл /etc/systemd/system/org.mate.SettingsDaemon.DateTimeMechanism.service:

Shell

$ cat /etc/systemd/system/org.mate.SettingsDaemon.DateTimeMechanism.service
[D-BUS Service]
Name=org.mate.SettingsDaemon.DateTimeMechanism
Exec=/usr/bin/msd-datetime-mechanism
User=root
$
Товарищи, это что за новости, то есть оно не умеет 'D-BUS Service'? Это ман лажовый или как? Это второй вопрос.

3) А сервис-то запускать всё равно нужно. Переделаем файл /etc/systemd/system/org.mate.SettingsDaemon.DateTimeMechanism.service

Shell

$ cat /etc/systemd/system/org.mate.SettingsDaemon.DateTimeMechanism.service
[Unit]
Description=Foo

[Service]
ExecStart=/usr/bin/msd-datetime-mechanism

[Install]
WantedBy=multi-user.target

$
Запустим сервис вручную, потом посмотрим его статус и вновь запустим нашу программу

Shell

$ sudo systemctl start org.mate.SettingsDaemon.DateTimeMechanism.service
$
$
$ sudo systemctl status org.mate.SettingsDaemon.DateTimeMechanism.service
● org.mate.SettingsDaemon.DateTimeMechanism.service - Foo
Loaded: loaded (/etc/systemd/system/org.mate.SettingsDaemon.DateTimeMechanism.service; disabled; preset: enabled)
Active: active (running) since Sat 2025-05-10 04:18:43 +05; 8s ago
Main PID: 28312 (msd-datetime-me)
Tasks: 3 (limit: 18819)
Memory: 3.0M
CPU: 18ms
CGroup: /system.slice/org.mate.SettingsDaemon.DateTimeMechanism.service
└─28312 /usr/bin/msd-datetime-mechanism

мая 10 04:18:43 debian systemd[1]: Started org.mate.SettingsDaemon.DateTimeMechanism.service - Foo.
$
$
$
$ ./main
good!
$
$
Чудо свершилось? Как бы не так:

Shell

$ sudo systemctl status org.mate.SettingsDaemon.DateTimeMechanism.service
× org.mate.SettingsDaemon.DateTimeMechanism.service - Foo
Loaded: loaded (/etc/systemd/system/org.mate.SettingsDaemon.DateTimeMechanism.service; disabled; preset: enabled)
Active: failed (Result: exit-code) since Sat 2025-05-10 04:19:13 +05; 1min 31s ago
Duration: 30.244s
Process: 28312 ExecStart=/usr/bin/msd-datetime-mechanism (code=exited, status=1/FAILURE)
Main PID: 28312 (code=exited, status=1/FAILURE)
CPU: 20ms

мая 10 04:18:43 debian systemd[1]: Started org.mate.SettingsDaemon.DateTimeMechanism.service - Foo.
мая 10 04:19:13 debian systemd[1]: org.mate.SettingsDaemon.DateTimeMechanism.service: Main process exited, code=exited, status=1/FAILURE
мая 10 04:19:13 debian systemd[1]: org.mate.SettingsDaemon.DateTimeMechanism.service: Failed with result 'exit-code'.
$
$
$ ./main
Error creating proxy: Error calling StartServiceByName for org.mate.SettingsDaemon.DateTimeMechanism: Failed to execute program org.mate.SettingsDaemon.DateTimeMechanism: Permission denied
bad!
$
$
Дело в том, что сервис org.mate.SettingsDaemon.DateTimeMechanism.service существует примерно 20 секунд, а потом падает. Что же делать? Ну давайте попробуем, пусть он автоматически рестартует, если упадёт

Shell

$ cat /etc/systemd/system/org.mate.SettingsDaemon.DateTimeMechanism.service
[Unit]
Description=Foo

[Service]
ExecStart=/usr/bin/msd-datetime-mechanism
Restart=always

[Install]
WantedBy=multi-user.target

$
Теперь не падает (ну или по быстроляну перезапускается). Прокси создаётся:

Shell

$ ./main
good!
$
Сервис org.mate.SettingsDaemon.DateTimeMechanism.service добавляем в автозагрузку, ось перезагружаем, работаем. Прокси создаётся

Shell

$ ./main
good!
$
Вопрос-то в другом- какого рожна падает сервис org.mate.SettingsDaemon.DateTimeMechanism.service и, как бы нам так сделать, чтобы он перезагружался с наименьшими потерями? Он рестартует каждые 20 секунд (Restart=always) но дело-то в том, что, быть может сервис не освобождает ресурсы и кто его знает чем это дело закончится. Может, зависнет ось и всё. Это третий вопрос.

А четвёртый вопрос: как так получается. что на одной оси (B) есть такая проблема, а на другой (A) такой проблемы нет, хотя файл /etc/systemd/system/org.mate.SettingsDaemon.DateTimeMechanism.service на обеих изначально отсутствует?
Я просто читаю маны.
Спасибо сказали: