Есть ли способ дождаться завершения загрузки

После проникновения вредоносного ПО в вашу систему ее следует считать скомпрометированной и ненадежной.

Таким образом, любые контрмеры по смягчению последствий, т.е. блокировка подключений к определенным IP-адресам небезопасна. Если вы -не реконструировали вредоносное ПО и не получили полного понимания того, как оно работает, вы никогда не можете быть уверены, что однажды оно снова не выдаст что-нибудь плохое.

Единственный хороший вариант — переформатировать вашу машину, т. е. «взорвать ее с орбиты» , и переустановить заново.

7
03.08.2018, 16:07
2 ответа

Файл модуля ожидания

Вот прототип, который делает то, что вы ищете. Для начала вот файл модуля systemd,waity.service:

$ cat /etc/systemd/system/waity.service
[Unit]
Description=Waity Service
After=systend-user-sessions.service

[Service]
Type=simple
ExecStart=/opt/bin/waity.sh

Сценарий ожидания

Он запускает скрипт, который опрашивает systemd, чтобы узнать, завершена ли загрузка:

$ cat /opt/bin/waity.sh
#!/bin/bash

while $(sleep 10); do
  echo "waiting for systemd to finish booting..."
  if systemctl is-system-running | grep -qE "running|degraded"; then
    break
  fi
done

echo "systemd finished booting..."
echo "...do something else..."

Пример запуска

Теперь включите эту службу:

$ systemctl enable --now waity.service

Теперь, когда мы запускаем нашу систему, эта служба будет находиться в 10-секундном цикле, пока не увидит, что действие is-system-runningдействия systemctlвозвращает состояние runningили degraded. Любой из них является признаком того, что система завершила загрузку.

Статус этой службы:

$ systemctl status waity.service
● waity.service - Waity Service
   Loaded: loaded (/etc/systemd/system/waity.service; static; vendor preset: disabled)
   Active: inactive (dead)

Aug 03 22:06:01 centos7 waity.sh[4519]: Got unexpected auxiliary data with level=1 and type=2
Aug 03 22:06:01 centos7 waity.sh[4519]: Got unexpected auxiliary data with level=1 and type=2
Aug 03 22:06:01 centos7 waity.sh[4519]: systemd finished booting...
Aug 03 22:06:01 centos7 waity.sh[4519]:...do something else...
Aug 03 22:06:01 centos7 systemd[1]: Child 4519 belongs to waity.service
Aug 03 22:06:01 centos7 systemd[1]: waity.service: main process exited, code=exited, status=0/SUCCESS
Aug 03 22:06:01 centos7 systemd[1]: waity.service changed running -> dead
Aug 03 22:06:01 centos7 systemd[1]: waity.service: cgroup is empty
Aug 03 22:06:01 centos7 systemd[1]: Collecting waity.service
Aug 03 22:07:17 centos7 systemd[1]: Collecting waity.service

В приведенных выше сообщениях мы видим, что мы обнаружили завершенную загрузку:

Aug 03 22:06:01 centos7 waity.sh[4519]: systemd finished booting...
Aug 03 22:06:01 centos7 waity.sh[4519]:...do something else...

В этот момент мы могли бы выполнить ...do something else.... Как только все это будет завершено, эта служба перейдет в состояние готовности/неработоспособности.

4
27.01.2020, 20:18

Можно дождаться этого условия, не опрашивая эту команду в цикле, но, к сожалению, это не так просто...

systemd отправит сигнал StartupFinished на шину D -после завершения загрузки, чтобы можно было следить за этим и получать уведомления об этом.

Вот простой dbus-waitинструмент , который может отслеживать сигналы на шине D -.

Мне удалось дождаться завершения запуска с помощью этой команды:

dbus-wait org.freedesktop.systemd1.Manager StartupFinished

Проблема с этим подходом заключается в том, что существует состояние гонки. Если я сначала проверю, работает ли система (с помощьюsystemctl is-system-running)и увижу, что она все еще «запускается», а затем решу дождаться сигнала, возможно, что к тому времени dbus-waitподключится к шине и начнет ждать для сигнала, который systemd только что завершил запуск и уже отправил этот сигнал в шину, что заставит dbus-waitждать события, которое не произойдет, и в конечном итоге истечет время ожидания...

С другой стороны, должна быть возможность реализовать это способом, свободным от условий гонки, сначала зарегистрировав часы для события, затем проверив свойство и, если оно все еще не установлено на «работает», запустите цикл событий для ожидания сигнала.

Я реализовал описанный выше подход и предложил его вышестоящему systemd. Мое предложение состоит в том, чтобы разрешить запуск systemctl is-system-running --waitдля этой цели (, но, возможно, это может привести к тому, что он будет передан в systemd с другим синтаксисом, возможно, отдельной командой. )Предложение по новой функции systemd можно найти по адресу PR #9796 в проекте systemd. (Я обновлю этот ответ, как только он будет принят и объединен.)


UPDATE:PR #9796 был только что объединен с systemd, поэтому, начиная с systemd v240,можно будет дождаться завершения загрузки с помощью следующей команды:

systemctl is-system-running --wait
5
27.01.2020, 20:18

Теги

Похожие вопросы