Я создал свой собственный сервис для jekyll, и когда я запускаю сервис, кажется, что он не работает как фоновый процесс, потому что я вынужден ctrl+ cвыходить из него. Он просто остается на переднем плане из-за --watch. Я не уверен, как обойти это и сделать так, чтобы он работал в фоновом режиме. Есть предположения?
# /etc/systemd/system/jekyll-blog.service
[Unit]
Description=Start blog jekyll
[Service]
Type=forking
WorkingDirectory=/home/blog
ExecStart=/usr/local/bin/jekyll build --watch --incremental -s /home/blog -d /var/www/html/blog &
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
User=root
Group=root
[Install]
WantedBy=multi-user.target
Type=forking
. Более того, он не будет работатьexecStart
как расширение оболочки, так что&
в конце никогда не будет восприниматься как фоновый флаг.Type=simple
будет уместно. Кроме того, это не то приложение, которое я запускаю от имени пользователя root, по крайней мере, на компьютере, выходящем в Интернет (что может быть не в вашем случае).--incremental
делает :). Да, я не вижу проблем с безопасностью при восстановлении файлов с правами root. Конечно, учитывая, что эти файлы не предоставлены пользователем.Ответы:
Systemd может обрабатывать различные типы сервисов, в частности один из следующих
simple
- Длительный процесс, который не справляется с самим собой и остается прикрепленным к оболочке.forking
- Типичный демон, который разветвляется, отсоединяя его от процесса, который его запускал, эффективно отгоняя себя.oneshot
- недолговечный процесс, который, как ожидается, завершится.dbus
- Вроде бы просто, но уведомление о завершении запуска процессов отправляется через dbus.notify
- Вроде бы просто, но уведомление об окончании запуска процессов отправляется поверх inotify.idle
- Вроде бы просто, но двоичный файл запускается после отправки задания.В вашем случае вы выбрали,
Type=forking
что означает, что systemd ожидает завершения процесса и завершения родительского процесса, что указывает на успешное начало процесса. Однако ваш процесс этого не делает - он остается на переднем плане и поэтомуsystemctl start
будет зависать бесконечно или до тех пор, пока процессы не завершатся.Вместо этого вы хотите
Type=simple
, что по умолчанию, так что вы можете полностью удалить строку, чтобы получить тот же эффект. В этом режиме systemd не ожидает завершения процессов (так как не знает, когда это произошло), и поэтому сразу же продолжает выполнять зависимые службы. В вашем случае их нет, так что это не имеет значения.Небольшая заметка о безопасности:
Вы запускаете службу от имени пользователя root, это не рекомендуется, поскольку она менее безопасна, чем ее использование в качестве непривилегированного пользователя. Причина этого заключается в том, что если в jekyll есть уязвимость, которая каким-то образом позволяет выполнять команды (возможно, с помощью кода, который он анализирует), то злоумышленнику не нужно ничего делать, чтобы полностью владеть вашей системой. Если, с другой стороны, он запускается как непривилегированный пользователь, злоумышленник может нанести такой же ущерб, как этот пользователь, и теперь должен попытаться получить привилегии root, чтобы полностью владеть вашей системой. Это просто добавляет дополнительный слой, который должен пройти атакующий.
Вы можете просто запустить его под тем же пользователем, на котором работает ваш веб-сервер, но это оставляет вас открытым для другой потенциальной атаки. Если на вашем веб-сервере есть уязвимость, позволяющая пользователю манипулировать файлами в вашей системе, он может изменить сгенерированные html-файлы или, что хуже, исходные файлы и заставить ваш сервер обслуживать все, что ему нужно. Однако, если сгенерированные файлы и исходные файлы доступны для чтения только веб-серверу и доступны для записи другим непривилегированным пользователям, они не смогут так же легко изменить их, атаковав веб-сервер.
Однако, если вы просто обслуживаете статические файлы с этого сервера и обновляете сервер, эти атаки очень маловероятны, но все же возможны. Вы несете ответственность за взвешивание рисков по сравнению с накладными расходами на настройку в зависимости от того, насколько критична ваша система, но оба эти совета очень просты в настройке и практически не требуют затрат на обслуживание.
источник
В дополнение к решению @ Michael Daffin , вы также можете использовать инструмент daemonize для достижения использования,
forking
как показано в следующем примере.Учитывая небольшой сценарий оболочки, который я хочу демонизировать и которым я хочу управлять через systemd, я сохранил его как
/home/pi/testscript.sh
:Если у вас его еще нет, установите daemonize, например так:
Теперь создайте файл определения файловой службы:
Недавно созданный сервис должен быть объявлен для systemd:
Теперь вы можете запустить сервис и скрипт вилки. Как и ожидалось, запуск службы сразу возвращается в оболочку. Результат очевиден:
источник
daemonize
+Type=forking
вместо того,Type=simple
чтобы позволить systemd позаботиться о запуске службы?Type=forking
это своего рода параметр совместимости в systemd для поддержки устаревших программ, написанных на fork.