Запустите systemctl из Bash-скрипта и не ждите его

#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 around systemctl , так что это не в конце скрипта. И exec действительно ждет! Я использовал это в других местах. Итак, извините, я не могу это использовать.