не удалось запустить службу

15

Я создал сервис systemd:

[Unit]
Description=My service

[Service]
Type=forking
ExecStart=/bin/sh $HOME/theFolder/run.sh
Restart=on-failure

[Install]
WantedBy=multi-user.target
Alias=mine.service

Я поместил его в папку / etc / systemd / system и назвал его mine.service.

Если я бегу, sudo service mine startэто дает мне:

Не удалось запустить mine.service.Unit mine.service не найдено

--- ОБНОВИТЬ -----

Я запускаю первым, sudo systemctl daemon-reloadи теперь он не дает мне никаких сообщений, но служба все еще не запускается.

Джордж
источник
10
Вы запускали systemctl daemon-reloadпосле создания файла модуля?
Виланд
@Wieland: Хм .. Теперь он не показывает мне никаких сообщений. Но он все еще не запускается.
Джордж
@don_crissti: статус говорит, что он активен, но скрипт (в ExecStart) не выполняется.
Джордж
как бы он знал правильный $ HOME? Что вы ожидаете от системной службы?
Серж
@Serge: Хмм .. Так, как я могу использовать $ HOME?
Джордж

Ответы:

14

$HOMEуказывает на домашний каталог пользователя, который запускает скрипт. Сервисы Systemd запускаются с правами root, поэтому он, скорее всего, попытается /root/theFolder/run.sh. Используйте абсолютные пути в служебных файлах.

У вас также есть forkingнабор параметров. Это необходимо для программы, которая сама работает в фоновом режиме, это делает ваш скрипт? Большинство из них этого не делает, и если у вас нет, вы должны удалить эту опцию, иначе systemd будет ждать завершения сценария, чтобы запросить его как запущенный.

Кроме того, файлы системной службы, которые указывают на сценарии в вашем домашнем каталоге, не рекомендуется и, возможно, представляют угрозу безопасности. Поскольку они запускаются с правами root, любой, кто может их изменить, потенциально может получить root-доступ к вашему компьютеру. Гораздо лучше скопировать скрипт /usr/local/binи убедиться, что он принадлежит и доступен для записи только пользователю root, чтобы остановить это. Также рекомендуется запускать сценарий как непривилегированный пользователь, используя параметры User=и Group=в служебном файле.

Если вы хотите запустить его от имени пользователя, лучше поместить служебный файл ~/.config/systemd/user/и запустить / включить его с помощью systemctl --user enable yourservice && systemctl --user start yourservice(обратите внимание, запускать от имени пользователя, а не пользователя root). Смотрите это для получения дополнительной информации о пользовательских файлах обслуживания.

Майкл Даффин
источник
: Я помещаю скрипт в / usr / local / bin, а сервис в /.config/systemd/user. Если я пытаюсь включить сервис, он показывает мне «лишние аргументы». Если я пытаюсь использовать systemctl, он показывает, что «не удалось» .. блок .. ', как-то так.
Джордж
Можете ли вы предоставить полные команды, которые вы пробовали, и более подробные журналы. Трудно отлаживать с фрагментами.
Майкл Даффин
: Есть ли решение использовать путь $ HOME? Потому что, если я помещаю скрипт в / usr / local / bin, он использует относительные пути к $ HOME . Я видел это. И я попытался вставить HOME=$HOMEпервый файл среды. Но служба не может запуститься, ошибок нет.
Джордж
1
на Ubuntu мне пришлось использовать systemctl для этого не systemd, с помощью systemd я получил ошибку «Excess Arguments»
Александр Миллс
1
@AlexanderMills Вы правы, правильная команда в systemctl и systemd была просто опечаткой в ​​ответе.
Майкл Даффин