1.)multi-user.target
в основном является ближайшим эквивалентом классического уровня запуска SysVinit 3, который есть у systemd
. Когда система systemd
загружается, systemd
пытается привести состояние системы в соответствие с состоянием, заданным параметром default.target
-, который обычно является псевдонимом для graphical.target
или multi-user.target
.
multi-user.target
обычно определяет состояние системы, при котором все сетевые службы запущены и система принимает входы в систему, но локальный графический интерфейс не запущен. Это типичное состояние системы по умолчанию для серверных систем, которые могут быть безголовыми системами, установленными в стойку -в удаленной серверной комнате.
graphical.target
— еще один возможный псевдоним для default.target
. Обычно он определяется как надмножествоmulti-user.target
:и включает в себя все, что делает multi-user.target
, плюс активация локального входа в систему с графическим интерфейсом.Это похоже на уровень выполнения 5 в классическом SysVinit.
Строка WantedBy=multi-user.target
в службе по существу аналогична указанию «эта служба должна запускаться на уровнях запуска 3, 4 и 5» в системах SysVinit :она говорит systemd
, что эта служба должна быть запущена как часть нормальный запуск системы -, независимо от того, активен локальный графический интерфейс или нет.
Тем не менее, WantedBy
отделен от включенного/отключенного состояния :, так что в другом смысле это своего рода «предустановка» :, она определяет, при каких условиях может произойти автоматический запуск, но только когда сервис включается в первую очередь.
2. )Если вы пропустите строку WantedBy=multi-user.target
и никакая другая включенная служба не включает Requires=your.service
или Wants=your.service
в определение службы, ваша служба не будет запущена автоматически.
systemd
работает на зависимостях, и во время загрузки, если ничего Requires
или Wants
не ваша служба, она не будет запущена, даже если служба включена.
Конечно, вы можете отредактировать свой default.target
, чтобы добавить или удалить строки Requires
или Wants
для любых служб, которые вы хотите запускать во время загрузки -, но так, чтобы вы могли просто добавить новый файл службы в систему. и заставить его работать по умолчанию (, что упрощает работу менеджеров пакетов программного обеспечения ), systemd
имеет ключевые слова WantedBy
и RequiredBy
, которые можно использовать для вставки зависимостей типа Wants
иRequires
-(соответственно )с "другого конца".
3. )Вы должны опустить эту строку, если вы не хотите, чтобы служба запускалась автоматически во время загрузки, или эта служба является частью цепочка зависимостей, которые вы определили явно.
Например, вы можете проводить рефакторинг серверного приложения A и по той или иной причине решить выделить некоторые дополнительные функции из него в отдельную службу B, чтобы предоставить пользователю возможность не устанавливать ее, если она не нужна. Затем вы можете сделать службу B отдельной service-B.rpm
,и определите B.service
с WantedBy=A.service
, чтобы заставить systemd
запускать службу B автоматически всякий раз, когда запускается служба A -, но только тогда, когда service-B.rpm
действительно установлена.
Обратите внимание, что Wants
или WantedBy
говорят только о том, что система должна запускать одну службу всякий раз, когда запускается другая служба или цель, но ничего не говорят о порядке запуска/остановки. Если вам нужно, чтобы служба B уже работала при запуске службы A, вам нужно добавить Before=A.service
в файл B.service
, чтобы явно указать зависимость запуска -up order.
4. )В любое время, когда вы делаете хотите, чтобы служба имела возможность запускаться автоматически во время загрузки, и нет других уже определенных зависимостей.
По крайней мере, с GNU sed вы можете использовать команду r
со специальным именем файла /dev/stdin
для чтения и постановки в очередь содержимого стандартного ввода для вставки в конце цикла(r
вроде как a
для файлов ).
Итак, если ваш generate-changelog
пишет на стандартный вывод, вы можете попробовать
generate-changelog | sed -i '4r/dev/stdin' CHANGELOG.md