#bash
#bash
Вопрос:
Мне нужно позвонить systemctl start myservice
ближе к концу сценария Bash, но меня действительно не волнует, будет ли он успешным или когда он собирается вернуться. Мне просто нужно начать действие. Следить за состоянием этой службы — задача других. Мой скрипт должен вернуться как можно быстрее, независимо от того, завершила ли эта служба запуск, я не завишу от этого.
Моей первой мыслью было использовать что-то вроде этого:
# do other work
systemctl start myservice amp;
echo "done"
# end of script
Но я читал, что это проблематично с сигналами или в неинтерактивных средах, где обычно вызывается мой скрипт. Итак, я прочитал и нашел nohup
команду, но, похоже, она записывает выходные файлы в любом месте и может зависнуть, если вы не перенаправите stdin из /dev/null, говорят они.
Так что я до сих пор не знаю, как это сделать правильно. Я открыт для общего способа запуска и забывания любого процесса из Bash-скрипта или, в systemctl
частности, поскольку это будет мой единственный вариант использования на данный момент.
Ответ №1:
Я нашел довольно простое решение для этого:
systemctl start --no-block myservice
Этот --no-block
параметр можно использовать для запуска, остановки и т. Д., И он не будет ждать завершения фактического процесса. Более подробная информация на странице руководства systemctl
.
Ответ №2:
Если вы просто хотите запустить systemctl
и не хотите этого ждать, используйте exec
для замены текущего процесса systemctl
вызовом. Например, вместо того, чтобы создавать фоновый процесс, просто используйте:
exec systemctl ....
Возможно, вы захотите включить --no-pager
опцию, чтобы гарантировать, что процесс не передается на пейджер, который блокирует ожидание ввода пользователем, например
exec systemctl --no-pager ....
Конечно, вы echo "done"
никогда не будете достигнуты, но это не относится к вашему сценарию.
Комментарии:
1. Я добавил это
echo
в качестве замены, потому что на самом деле естьif
aroundsystemctl
, так что это не в конце скрипта. Иexec
действительно ждет! Я использовал это в других местах. Итак, извините, я не могу это использовать.