отложенное выполнение сценария bash после загрузки

Вот рабочее решение для него (протестировано RHEL 7):

$ export test1='git --git-dir'
$ export test2='my-folder/.git/ add Steps-to-follow.txt'
$ #; git --git-dir'
$ export test3='my-folder/.git/ commit'
$ export git1=$test1=$test2
$ export git2=$test1=$test3
$ $git1
$ $git2

Это будет работать. Я не могу сказать, что это самое оптимальное решение, однако оно работает так, как мне нужно, и оно может понадобиться. && или ; (для запуска нескольких команд с использованием one env. var.) не сработало у меня так, как я ожидал, и поэтому я перешел на это приемлемое решение на данный момент. Если кто-то предложит что-то лучшее или улучшенное, прокомментируйте.

0
27.05.2019, 10:37
2 ответа

После проб и ошибок я реализовал это решение.

Я прикрепил свой скрипт к systemdсервису:

[Unit]
Description=Make VMs reachable from the internet
Wants=network-online.target
After=network-online.target

[Service]
Type=oneshot
ExecStart=/home/…/virbr0-enable.sh

[Install]
Alias=makeVMvisible.service
WantedBy=multi-user.target

Я заставил его ждать, пока сеть не заработает (после network -online.target ), которая, как я полагаю, сама зависит от firewalld.service , а также после multi -user.target достигнут. Последнее может быть излишним (, потому что я не знаю точных отношений зависимости между целями и сервисами ), но это не повредит.

Таким образом, это все еще не работало. Служба systemd не была неисправна, потому что руководство systemctl start makeVMvisible.serviceпереводило виртуальный мост в режим сквозной передачи. Задержка кажется необходимой. :Я добавил команду sleepв начало скрипта.

Экспериментально установлено, что пороговое значение задержки составляет от 1 до 2 секунд. Я выбрал sleep 5, что не имеет большого значения в прошедшем времени и довольно консервативно.

Однако я не нахожу свое решение очень удовлетворительным. Кто-нибудь знает о лучшей зависимости, чем network -online.target ?

1
28.01.2020, 02:40

Можно ли подключиться к виртуальной машине с хоста до того, как ей будет передан внешний IP-адрес? Если это так, то вы можете использовать удаленную функцию systemctlдля проверки состояния загрузки виртуальной машины.

Для этого необходимо, чтобы виртуальная машина была доступна с помощью ключа ssh с хоста.

На хосте, который вы запустите:

systemctl -H <vm name or ip> --quiet is-active multi-user.target

Выполняется успешно, если указанный блок активен.

Таким образом, в bash вы можете сделать что-то вроде:

until systemctl -H <vm name or ip> --quiet is-active multi-user.target; do
    sleep 5
done

Теперь это не будет продолжаться до тех пор, пока именованное устройство на данном хосте не будет включено.

0
28.01.2020, 02:40

Теги

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