LINUX.ORG.RU

Запуск systemd сервиса после соединения с сетью

 , , ,


0

1

Всех приветствую.

Какая-то странная шляпа с этим кейсом. Есть простой сервис motion на десктопной установке дебиана 11. Выглядит так

[Unit]
Description=Motion detection video capture daemon
Documentation=man:motion(1)

[Service]
ExecStart=/usr/bin/motion

[Install]
WantedBy=default.target

Нужно, чтобы он при загрузке включался после того, как установлено соединение с сетью. Нагуглил про network-online.target. Он у меня есть и работает

systemctl status network-online.target 
● network-online.target - Network is Online
     Loaded: loaded (/lib/systemd/system/network-online.target; static)
     Active: active since Fri 2021-09-03 16:29:05 MSK; 20h ago
       Docs: man:systemd.special(7)
             https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget

Sep 03 16:29:05 hs1-deb systemd[1]: Reached target Network is Online.

Добавляю в секцию UNIT сервиса строки

After=network-online.target
Requires=network-online.target

Делаю daemon-reaload, а мне в ответ

Failed to restart motion.service: Unit network-online.target not found.

Я погуглил еще, нашел инфу, что лет 7 назад сломали этот network-online.target, и нужно использовать NetworkManager-wait-online.service. Я проверил

systemctl status NetworkManager-wait-online.service 
● NetworkManager-wait-online.service - Network Manager Wait Online
     Loaded: loaded (/lib/systemd/system/NetworkManager-wait-online.service; enabled; vendor preset: enabled)
     Active: active (exited) since Sat 2021-09-04 11:17:11 MSK; 1h 21min ago
       Docs: man:nm-online(1)
   Main PID: 1139564 (code=exited, status=0/SUCCESS)
      Tasks: 0 (limit: 9388)
     Memory: 0B
        CPU: 0
     CGroup: /system.slice/NetworkManager-wait-online.service

Sep 04 11:17:11 hs1-deb systemd[1]: Starting Network Manager Wait Online...
Sep 04 11:17:11 hs1-deb systemd[1]: Finished Network Manager Wait Online.

Редактирую свой сервис, убираю network-online.target

[Unit]
Description=Motion detection video capture daemon
Documentation=man:motion(1)
After=NetworkManager-wait-online.service
Requires=NetworkManager-wait-online.service

[Service]
User=user
ExecStart=/usr/bin/motion

[Install]
WantedBy=default.target

daemon-reload и…

Failed to restart motion.service: Unit NetworkManager-wait-online.service not found.

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

Поэкспериментировал с обходными путями. Как оказалось любой target в качестве точки привязки не работает.

graphical.target @21.227s
└─multi-user.target @21.227s
  └─plymouth-quit-wait.service @580ms +20.646s
    └─systemd-user-sessions.service @572ms +6ms
      └─network.target @569ms
        └─wpa_supplicant.service @537ms +25ms
          └─dbus.service @523ms
            └─basic.target @518ms
              └─sockets.target @518ms
                └─dbus.socket @518ms
                  └─sysinit.target @517ms
                    └─apparmor.service @424ms +92ms
                      └─local-fs.target @423ms
                        └─run-user-1000-gvfs.mount @847ms
                          └─run-user-1000.mount @680ms
                            └─swap.target @337ms
                              └─dev-disk-by\x2duuid-d1502176\x2dc277\x2d46cb\x2d8cd9\x2d25e47a8694a3.swap @286ms +46ms
                                └─dev-nvme0n1p3.device @286ms

graphical.target, multi-user.target дают те же результаты. Получается, такой способ запуска юнитов хоть и задокументирован, но вообще не работает?

Yorween ()
Последнее исправление: Yorween (всего исправлений: 1)

Чтобы исключить очевидное: сервис motion это системный сервис или пользовательский? Где он лежит? Какой командой ты его запускаешь?

eternal_sorrow ★★★★★ ()
Ответ на: комментарий от eternal_sorrow

Забавно, когда читал доки на freedesktop такой инфы не увидел, но когда ты сказал про этом, нагуглить было не сложно, если знать, что гуглить.

Клевый systemd, надо сказать. Вроде со стороны смотришь - удобно, а когда внутри копаешься - столько проблем…

Yorween ()
Ответ на: комментарий от Gonzo

Через юзерский сервис никак. Накостылил в ExecStart скрипт, который сначала пингует гугл 2 пакетами, и если пинг успешный, стартует motion.

Yorween ()
Ответ на: комментарий от Yorween

Я как-то озадачился запуском пользовательского сервиса при старте системы. Оказалось только рут, только хардкор.

То есть запустить что угодно от рута - запросто, а от пользователя - только после логина.

utanho ★★★ ()
Ограничение на отправку комментариев: только для зарегистрированных пользователей