Поручить выполнить блок после успешного завершения работы другого устройства

Я использую cloud-config для установки и настройки кластера DCOS.

Обычно для agentinstall.service требуется 5 минут.

Можно ли поручить systemd выполнить agentconfigure.service только после завершения установки agentinstall.service ?

 # Облако-конфигурации
 coreos:
   единицы:
     - name: "agentinstall.service"
       команда: "start"
       содержание: |
         [Ед. изм]
         Описание = agent_setup
         После того, как = network.target

         [Обслуживание]
         Тип = простой
         Пользователь = корень
         WorkingDirectory = / TMP
         ExecStartPre = / bin / curl -o /tmp/dcos_install.sh http: //bootstapnode-0.dev.myztro.internal: 9090 / dcos_install.sh
         ExecStartPre = / bin / chmod 755 dcos_install.sh
         ExecStart = / bin / bash dcos_install.sh slave

         [Установить]
         WantedBy = multi-user.target
     - name: "agentconfigure.service"
       команда: "start"
       содержание: |
         [Ед. изм]
         Описание = agent_config
         После того, как = agentinstall.service

         [Обслуживание]
         Тип = простой
         Пользователь = корень
         WorkingDirectory = / Opt / мезосфере / и т.д. /
         ExecStartPre = / bin / echo "MESOS_ATTRIBUTES = cluster: uploader" >> / opt / mesosphere / etc / mesos-slave-common
         ExecStartPre = / bin / rm -f / var / lib / mesos / slave / meta / slaves / latest
         ExecStart = / usr / bin / systemctl restart dcos-mesos-slave

         [Установить]
         WantedBy = multi-user.target

Спасибо.

2 Solutions collect form web for “Поручить выполнить блок после успешного завершения работы другого устройства”

Я не знаю, как это сделать с systemd, поскольку я думаю, что это касается только запуска и запуска блоков. Как и в случае, вы можете использовать After= чтобы заставить устройство запускаться только ПОСЛЕ того, как он был запущен, или оба запускаются параллельно.

Wants= приведет к тому, что указанные единицы будут запущены параллельно (если требуемые устройства еще не запущены / активны), а не то, что вы хотите.

Requires= будет, если используется в сочетании с After= on agentconfigure.service , убедитесь, что запущен agentinstall.service ПОСЛЕ agentinstall.service agentconfigure.service ( agentinstall.service ) активен («занят»). Теперь у вас может быть цикл в agentconfigure.service который ждет, скажем, максимум 5 минут, и регулярно проверяет завершение работы agentinstall.service прежде чем он agentinstall.service свою фактическую работу. Единственный вариант, который я вижу для этого.

EDIT: Еще один вариант, который, я думаю, еще лучше … agentinstall.service запускает agentinstall.service когда установка завершается успешно, а затем завершается.

Вы хотите запустить команду /bin/bash dcos_install.sh slave ?

Измените службу с помощью этой команды на Type=oneshot . Кроме того, я не думаю, что вам нужно использовать ExecStartPre =, просто используйте ExecStart = для всего.


@JdeBP просит указать, что ваша команда echo пытается использовать перенаправление оболочки, которое не будет работать .

  • системный таймер каждые 2 часа через 30 минут после часа?
  • «Systemctl list-timers» показывает последние выполненные даты, которые далеки в будущем
  • Синхронизировать почту с помощью offlineimap через службу / таймер systemd; получение пароля из гнома
  • systemd: изящно сбой резервного копирования, когда внешний диск не подключен
  • Как настроить Systemd Timer для запуска службы в последний день месяца
  • systemd: Как выполнять задание как периодически, так и один раз при завершении работы системы?
  • Linux и Unix - лучшая ОС в мире.