У меня это произошло после обновления RHEL 7.4 -> 7.5. Сокет Dbus перемещен в /run/dbus/system_bus_socket
. Несмотря на то, что systemd явно указывает на /run/dbus/system_bus_socket
, он все еще хочет подключиться через /var/run/dbus/system_bus_socket
:
[root@ipsystem]# systemctl restart systemd-logind.service
Error getting authority: Error initializing authority: Could not connect: Connection refused (g-io-error-quark, 39)
Обратите внимание, что он подключается к сокету /run/dbus/:
[root@ip-10-0-254-241 system]# lsof -p `pidof systemd`|grep socket
systemd 1 root 14u unix 0xffff9385a4507c00 0t0 54528 socket
systemd 1 root 19u unix 0xffff9385c8411400 0t0 69828 /run/dbus/system_bus_socket
systemd 1 root 21u unix 0xffff9385c8412800 0t0 78276 socket
systemd 1 root 52u unix 0xffff9384f1b3bc00 0t0 13426 /run/lvm/lvmpolld.socket
systemd 1 root 71u unix 0xffff9384f40de000 0t0 9631 /run/systemd/journal/socket
systemd 1 root 75u unix 0xffff9384f1b28c00 0t0 12918 /run/lvm/lvmetad.socket
[root@ipsystem]# mv /var/run/dbus/system_bus_socket /var/run/dbus/system_bus_socket.old
[root@ipsystem]# systemctl restart dbus NetworkManager
Error getting authority: Error initializing authority: Could not connect: No such file or directory (g-io-error-quark, 1)
[root@ipsystem]# ls -l /var/run/dbus/system_bus_socket
ls: cannot access /var/run/dbus/system_bus_socket: No such file or directory
Явно все еще ищет сокет /var/run/dbus/system _bus _.
Связь /var/run/dbus/system_bus_socket
с/run/dbus/system_bus_socket
:
[root@ipsystem]# ln -s /run/dbus/system_bus_socket /var/run/dbus/system_bus_socket```
Теперь работает как положено:
[root@ipsystem]# systemctl restart dbus systemd-logind
[root@ipsystem]# systemctl status dbus systemd-logind
● dbus.service - D-Bus System Message Bus
Loaded: loaded (/usr/lib/systemd/system/dbus.service; static; vendor preset: disabled)
Active: active (running) since Mon 2018-04-16 15:07:38 UTC; 9s ago
Docs: man:dbus-daemon(1)
Main PID: 18217 (dbus-daemon)
CGroup: /system.slice/dbus.service
└─18217 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
Apr 16 15:07:38 systemd[1]: Started D-Bus System Message Bus.
Apr 16 15:07:38 systemd[1]: Starting D-Bus System Message Bus...
● systemd-logind.service - Login Service
Loaded: loaded (/usr/lib/systemd/system/systemd-logind.service; static; vendor preset: disabled)
Active: active (running) since Mon 2018-04-16 15:07:38 UTC; 9s ago
Docs: man:systemd-logind.service(8)
man:logind.conf(5)
http://www.freedesktop.org/wiki/Software/systemd/logind
http://www.freedesktop.org/wiki/Software/systemd/multiseat
Main PID: 18220 (systemd-logind)
Status: "Processing requests..."
CGroup: /system.slice/systemd-logind.service
└─18220 /usr/lib/systemd/systemd-logind
Файлы конфигурации:
[root@ip]# cat /usr/lib/systemd/system/sockets.target.wants/dbus.socket
[Unit]
Description=D-Bus System Message Bus Socket
[Socket]
ListenStream=/run/dbus/system_bus_socket
[root@ip]# cat /usr/lib/systemd/system/dbus.socket
[Unit]
Description=D-Bus System Message Bus Socket
[Socket]
ListenStream=/run/dbus/system_bus_socket
Согласноhttps://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html-single/system_administrators_guide/index#sect-Managing_Services_with_systemd-Remote(обновленной ссылке ), вы действительно можете это сделать, но я никогда этого не пробовал. Он основан на ssh, и я не знаю, как использовать его в файле :(, но ваш app3.service
может выполнить что-то вроде ssh -i /path/to/ssh_key user@host systemctl start real_service
.
Я достигаю этого, используя локальную службу, которая запускает netcat
для запуска удаленной службы через сокет.
local.service
:
[Unit]
Description=Local control of a remote service
[Service]
Type=simple
ExecStart=/bin/nc remote-machine remote-port
StandardOutput=journal
StandardError=journal
SuccessExitStatus=1
remote.socket
:
[Unit]
Description=Socket for allowing remote control of our service
[Socket]
ListenStream=listen-port
Accept=yes
[Install]
WantedBy=sockets.target
remote@.service
:
[Unit]
Description=A service running on another machine
Requires=remote.socket
[Service]
Type=simple
ExecStart=/path/to/application
StandardInput=socket
StandardOutput=socket
StandardError=socket
Установите local.service
на основной компьютер. Установите remote.socket
и remote@.service
на машину, на которую вы переносите эту работу. На удаленной машине начните прослушивание с помощью
systemctl start remote.socket
Проверьте это на своем локальном компьютере (замените remote-ip
иremote-port
):
netcat remote-machine-ip remote-port
Вы должны увидеть запущенный удаленный процесс. stdout
и stderr
должны появиться в вашем терминале. Если приложение принимает stdin
, вы также можете использовать его здесь. Убейте netcat
локально, и вы должны увидеть остановку удаленной службы. Как только вы будете довольны этим, включите сокет, чтобы он начал слушать после загрузки, запустив это на удаленной машине:
systemctl enable remote.socket
Наконец, соедините все вместе с
systemctl start local.sevice
Ваша удаленная служба должна быть запущена
systemctl stop local.servce
Ваша удаленная служба должна быть остановлена.
Теперь вы можете добавить любыеRequires=
WantedBy=
PartOf=
отношения, которые вы хотите local.service
для запуска удаленной службы.