Как создать службу, которая начинается при запуске?

На этом уже несколько вопросов, но я столкнулся с проблемой с использованием метода, который я использовал в прошлом. В старых версиях Ubuntu я использовал этот учебник .

  1. Я создал файл /etc/init.d/myservice.sh

  2. Файл содержит следующее:

#!/bin/bash SERVICE_NAME=myservice PATH_TO_JAR=/usr/local/MyProject/MyProject.jar PID_PATH_NAME=/var/run/$SERVICE_NAME.pid case $1 in start) echo "Starting $SERVICE_NAME ..." if [ ! -f $PID_PATH_NAME ]; then nohup java -jar $PATH_TO_JAR /tmp 2>> /dev/null >> /dev/null & echo $! > $PID_PATH_NAME echo "$SERVICE_NAME started ..." else echo "$SERVICE_NAME is already running ..." fi ;; stop) if [ -f $PID_PATH_NAME ]; then PID=$(cat $PID_PATH_NAME); echo "$SERVICE_NAME stoping ..." kill $PID; echo "$SERVICE_NAME stopped ..." rm $PID_PATH_NAME else echo "$SERVICE_NAME is not running ..." fi ;; restart) if [ -f $PID_PATH_NAME ]; then PID=$(cat $PID_PATH_NAME); echo "$SERVICE_NAME stopping ..."; kill $PID; echo "$SERVICE_NAME stopped ..."; rm $PID_PATH_NAME echo "$SERVICE_NAME starting ..." nohup java -jar $PATH_TO_JAR /tmp 2>> /dev/null >> /dev/null & echo $! > $PID_PATH_NAME echo "$SERVICE_NAME started ..." else echo "$SERVICE_NAME is not running ..." fi ;; esac

  1. Я убедился, что файл имеет правильные разрешения / владельца

  2. Я запускаю sudo service myservice start , и я получаю следующую ошибку.

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

Когда я посмотрел на это, я нашел много противоречивой информации. Я нашел ответы stackoverflow, говорящие, что вы больше не можете использовать этот метод, а другие говорят, что этот метод по-прежнему поддерживается. Каков правильный метод, если я использую Ubuntu 16.04 (и, возможно, укажу мне на учебник?), И если этот метод все еще действителен, может кто-то указать мне в сторону, почему он не будет работать сейчас?

Мне удалось найти интересную статью о том, почему init нужно было заменить, и на что он был заменен. Чтобы процитировать его: «Процесс инициализации начинается последовательно, то одна задача запускается только после того, как последний запуск задачи был успешным, и он был загружен в память. Это часто приводило к задержке и длительной загрузке. Однако системаdd не была рассчитана на скорость, но для делая вещи аккуратно, которые в свою очередь избегают всей необходимой для ООН задержки ».

Итак, чтобы ответить на мой собственный вопрос, похоже, что systemd заменил init.d на некоторые допустимые причины, а другие методы, например, что упоминается в комментариях GypsyCosmonaut, – это просто запустить сценарий запуска в ~/.config/autostart который также поставляется с удобным приложением Startup Applications, если вы используете рабочий стол.

пример init.d


На всякий случай, если кто-то действительно хочет сделать то, что я изначально пытался, вам просто нужна ссылка на каталог /etc/init.d.

Например, если у вас есть файл .jar, который нужно запустить с помощью команд, похожих на /etc/init.d/yourProgram start или /etc/init.d/yourProgram stop , вы просто сделаете что-то похожее:

 sudo ln -s /path/to/yourProgram.jar /etc/init.d/yourProgram 

Вышеупомянутый метод также работает, если вы укажете его на скрипт, который запускает вашу программу, а не .jar

Запуск init.d при загрузке


Если вы хотите, чтобы служба запускалась при запуске, используйте:

 sudo service yourProgram defaults 

Это автоматически будет выглядеть в /etc/init.d/ и найти ссылку на фактический скрипт.