Я боролся с этим последние часы, и, насколько я понимаю в документах, прямого пути нет. У меня есть конфигурация / состояние под названием IS_PAIRED, который хранится внутри некоторого файла .conf. Если для этой конфигурации установлено значение false, я хочу предотвратить запуск службы, а также выполнить ее предварительные шаги.
Дальнейший контекст: основная служба - это долго работающая служба. Это часть более крупного приложения. Эта служба должна запускаться только после того, как основное приложение будет сопряжено с другим приложением. Конфигурация IS_PAIRED управляется другой службой в том же приложении. Когда он будет установлен, сказать невозможно - это выбор пользователя. Все остальные службы в приложении можно запустить только после установки IS_PAIRED. В противном случае начинать их нет смысла. Параметр IS_PAIRED сохраняется. После того, как он установлен, сервис должен загружаться при загрузке.
Я начал с этого:
[Service]
Restart=on-failure
ExecStartPre=/bin/grep -q '^IS_PAIRED=true$' /etc/p.conf
ExecStartPre=/bin/sh -c "echo 'aaa' > /vagrant/b.sh"
ExecStart=/vagrant/a.sh
ExecStopPost=/vagrant/utils/bin/delay_service_restart.sh test
[Install]
WantedBy=multi-user.target
Что происходит, когда IS_PAIRED неверно, это то, что systemd дает сбой, запускает PostStop, а затем продолжает перезапуск. Я не хочу, чтобы это случилось. Если эта конфигурация не задана, служба должна просто стать неактивной. Я не хочу переключать Начать сначала ценность для прерывание, потому что иногда длительный процесс (дублируемый как a.sh здесь) перехватит исключение и закроется с ошибкой, а не будет уничтожен сигналом.
Затем я попробовал это (служба называется тест):
[Service]
Restart=on-failure
ExecStartPre=/bin/bash -c "grep -q '^IS_PAIRED=true$' /etc/p.conf || systemctl stop test"
ExecStartPre=/bin/sh -c "echo 'aaa' > /vagrant/b.sh"
ExecStart=/vagrant/a.sh
ExecStopPost=/vagrant/utils/bin/delay_service_restart.sh test
[Install]
WantedBy=multi-user.target
Что происходит сейчас, так это то, что второй ExecStartPre выполняется до остановки службы. Для меня это нехорошо, так как в реальном коде есть инициализации, которые я не хочу разрешать с неустановленной конфигурацией.
В моей последней попытке это действительно стало странно:
[Service]
Restart=on-failure
ExecStartPre=/bin/bash -c "grep -q '^IS_PAIRED=true$' /etc/p.conf || { systemctl stop test; /bin/false; }"
ExecStartPre=/bin/sh -c "echo 'aaa' > /vagrant/b.sh"
ExecStart=/vagrant/a.sh
ExecStopPost=/vagrant/utils/bin/delay_service_restart.sh test
[Install]
WantedBy=multi-user.target
Я думал, что здесь хитрый, но нет, второй ExecStartPre все еще бежал. Я думал, что схожу с ума, поэтому я проверил, что первый действительно выдает ошибку:
vagrant@ubuntu-bionic:~$ sudo /bin/bash -c "grep -q '^IS_PAIRED=true$' /etc/p.conf || { systemctl stop test; /bin/false; }"
vagrant@ubuntu-bionic:~$ sudo echo $?
1
В общем, я довольно растерян, и у меня есть два вопроса:
Как мне достичь желаемой логики? Я вижу два возможных решения, которые мне не нравятся:
Если нет правильного пути - почему мой последний взлом не работает? :(