Systemd может обрабатывать различные типы сервисов, в частности один из следующих
simple
- Длительный процесс, который не справляется с самим собой и остается прикрепленным к оболочке.
forking
- Типичный демон, который разветвляется, отсоединяя его от процесса, который его запускал, эффективно отгоняя себя.
oneshot
- недолговечный процесс, который, как ожидается, завершится.
dbus
- Вроде бы просто, но уведомление о завершении запуска процессов отправляется через dbus.
notify
- Вроде бы просто, но уведомление об окончании запуска процессов отправляется поверх inotify.
idle
- Вроде бы просто, но двоичный файл запускается после отправки задания.
В вашем случае вы выбрали, Type=forking
что означает, что systemd ожидает завершения процесса и завершения родительского процесса, что указывает на успешное начало процесса. Однако ваш процесс этого не делает - он остается на переднем плане и поэтому systemctl start
будет зависать бесконечно или до тех пор, пока процессы не завершатся.
Вместо этого вы хотите Type=simple
, что по умолчанию, так что вы можете полностью удалить строку, чтобы получить тот же эффект. В этом режиме systemd не ожидает завершения процессов (так как не знает, когда это произошло), и поэтому сразу же продолжает выполнять зависимые службы. В вашем случае их нет, так что это не имеет значения.
Небольшая заметка о безопасности:
Вы запускаете службу от имени пользователя root, это не рекомендуется, поскольку она менее безопасна, чем ее использование в качестве непривилегированного пользователя. Причина этого заключается в том, что если в jekyll есть уязвимость, которая каким-то образом позволяет выполнять команды (возможно, с помощью кода, который он анализирует), то злоумышленнику не нужно ничего делать, чтобы полностью владеть вашей системой. Если, с другой стороны, он запускается как непривилегированный пользователь, злоумышленник может нанести такой же ущерб, как этот пользователь, и теперь должен попытаться получить привилегии root, чтобы полностью владеть вашей системой. Это просто добавляет дополнительный слой, который должен пройти атакующий.
Вы можете просто запустить его под тем же пользователем, на котором работает ваш веб-сервер, но это оставляет вас открытым для другой потенциальной атаки. Если на вашем веб-сервере есть уязвимость, позволяющая пользователю манипулировать файлами в вашей системе, он может изменить сгенерированные html-файлы или, что хуже, исходные файлы и заставить ваш сервер обслуживать все, что ему нужно. Однако, если сгенерированные файлы и исходные файлы доступны для чтения только веб-серверу и доступны для записи другим непривилегированным пользователям, они не смогут так же легко изменить их, атаковав веб-сервер.
Однако, если вы просто обслуживаете статические файлы с этого сервера и обновляете сервер, эти атаки очень маловероятны, но все же возможны. Вы несете ответственность за взвешивание рисков по сравнению с накладными расходами на настройку в зависимости от того, насколько критична ваша система, но оба эти совета очень просты в настройке и практически не требуют затрат на обслуживание.
Type=forking
. Более того, он не будет работатьexecStart
как расширение оболочки, так что&
в конце никогда не будет восприниматься как фоновый флаг.