Как запустить службу в Linux? [Дубликат]

О Боже! Я только что видел ваше опубликованное изображение снова, вы просто открываете свой php-файл в браузере. у вас есть open, использующий localhost url. если вы открываете файл непосредственно из своего каталога, он не будет выполнять php-код в любом случае.

use: http://locahost/index.php или http:127.0.0.1/index.php

включить php-код в вашем случае , вы используете <?, который является коротким кодом php для <?php

, по умолчанию короткие короткие коды php отключены.

также используют: sudo apt-get install php5 libapache2-mod-php5 php5-mcrypt, если вы являетесь пользователем ubuntu .

111
задан javaPlease42 9 January 2015 в 00:19
поделиться

13 ответов

Я написал еще одну простую оболочку:

#!/bin/sh
SERVICE_NAME=MyService
PATH_TO_JAR=/usr/local/MyProject/MyJar.jar
PID_PATH_NAME=/tmp/MyService-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 

Вы можете выполнить полный учебник для init.d здесь и для systemd (ubuntu 16 +) здесь

Если вам нужен выходной журнал, замените строки 2

nohup java -jar $PATH_TO_JAR /tmp 2>> /dev/null >> /dev/null &

для

nohup java -jar $PATH_TO_JAR >> myService.out 2>&1&
217
ответ дан PbxMan 22 August 2018 в 03:16
поделиться
  • 1
    @PbxMan благодарит за это. Я мог бы дать ему повод и посмотреть, как мы продвигаемся. Приветствия. – dreza 22 January 2014 в 22:52
  • 2
    но как я могу запустить этот файл? где я должен это поставить? – Jack Daniel 30 October 2015 в 15:54
  • 3
    @JackDaniel на дистрибутивах на основе debian, таких как debian и ubuntu, вы можете добавить этот скрипт в /etc/init.d. Затем вы можете вызвать его так: /etc/init.d/MyService start. И вы можете запустить его автоматически, выполнив установки update-rc.d MyService по умолчанию. – Andre 26 January 2016 в 15:15
  • 4
    @ ThorbjørnRavnAndersen Это будет зависеть от вашей java-программы. Если вы не можете убить свою Java-программу Проверьте stackoverflow.com/questions/2541597/… . Я бы удалил MyService-pid вместо kill и имел поток deamon в части Java, который проверяет, существует ли он. – PbxMan 13 February 2017 в 16:29
  • 5
    Где будет выходной файл банки? как я могу настроить его имя? – M. Schena 5 April 2017 в 14:48

Сценарий инициализации службы Linux хранится в /etc/init.d. Вы можете скопировать и настроить файл /etc/init.d/skeleton, а затем вызвать

service [yourservice] start|stop|restart

см. http://www.ralfebert.de/blog/java/debian_daemon/ . Его для Debian (так, Ubuntu также), но подходит для большего распространения.

30
ответ дан akauppi 22 August 2018 в 03:16
поделиться
  • 1
    Выглядит многообещающе. Я расскажу об этом подробнее. ура – dreza 26 June 2012 в 10:43

Другим вариантом, который также довольно популярен, является Java Service Wrapper . Это также довольно популярно в сообществе OSS.

7
ответ дан carlspring 22 August 2018 в 03:16
поделиться
  • 1
    Приветствия. Я видел некоторые упоминания об этом. Подойдет ближе. – dreza 26 June 2012 в 10:42
5
ответ дан Community 22 August 2018 в 03:16
поделиться
  • 1
    supervisord отлично, для тех, кто этого не знает, он позволяет осуществлять мониторинг служб (который должен быть foreground - not daemonized), он будет автоматически перезапускать службы (и может отправлять сообщения по электронной почте, когда перезапуска происходят через плагины) – wired00 6 July 2016 в 23:35

Однако как только я начал работать, я не знаю, как получить к нему доступ, чтобы остановить его

Вы можете написать простой скрипт остановки, который greps для вашего Java-процесса, извлекает PID и звонки убивают на нем. Это не фантазия, но это прямолинейно. Что-то вроде этого может помочь в начале:

#!/bin/bash
PID = ps ax | grep "name of your app" | cut -d ' ' -f 1
kill $PID
0
ответ дан hovanessyan 22 August 2018 в 03:16
поделиться
  • 1
    Я не очень хорошо разбираюсь в Linux, но не делает pkill nameofprocess примерно то же самое? – Denys Séguret 26 June 2012 в 20:10

Вот пример сценария оболочки (убедитесь, что вы заменили имя MATH именем вашего приложения):

#!/bin/bash

### BEGIN INIT INFO
# Provides:                 MATH
# Required-Start:           $java
# Required-Stop:            $java
# Short-Description:        Start and stop MATH service.
# Description:              -
# Date-Creation:            -
# Date-Last-Modification:   -
# Author:                   -
### END INIT INFO

# Variables
PGREP=/usr/bin/pgrep
JAVA=/usr/bin/java
ZERO=0

# Start the MATH
start() {
    echo "Starting MATH..."
    #Verify if the service is running
    $PGREP -f MATH > /dev/null
    VERIFIER=$?
    if [ $ZERO = $VERIFIER ]
    then
        echo "The service is already running"
    else
        #Run the jar file MATH service
        $JAVA -jar /opt/MATH/MATH.jar > /dev/null 2>&1 &
        #sleep time before the service verification
        sleep 10
        #Verify if the service is running
        $PGREP -f MATH  > /dev/null
        VERIFIER=$?
        if [ $ZERO = $VERIFIER ]
        then
            echo "Service was successfully started"
        else
            echo "Failed to start service"
        fi
    fi
    echo
}

# Stop the MATH
stop() {
    echo "Stopping MATH..."
    #Verify if the service is running
    $PGREP -f MATH > /dev/null
    VERIFIER=$?
    if [ $ZERO = $VERIFIER ]
    then
        #Kill the pid of java with the service name
        kill -9 $($PGREP -f MATH)
        #Sleep time before the service verification
        sleep 10
        #Verify if the service is running
        $PGREP -f MATH  > /dev/null
        VERIFIER=$?
        if [ $ZERO = $VERIFIER ]
        then
            echo "Failed to stop service"
        else
            echo "Service was successfully stopped"
        fi
    else
        echo "The service is already stopped"
    fi
    echo
}

# Verify the status of MATH
status() {
    echo "Checking status of MATH..."
    #Verify if the service is running
    $PGREP -f MATH > /dev/null
    VERIFIER=$?
    if [ $ZERO = $VERIFIER ]
    then
        echo "Service is running"
    else
        echo "Service is stopped"
    fi
    echo
}

# Main logic
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        status
        ;;
    restart|reload)
        stop
        start
        ;;
  *)
    echo $"Usage: $0 {start|stop|status|restart|reload}"
    exit 1
esac
exit 0
4
ответ дан Matheus Oliveira 22 August 2018 в 03:16
поделиться

В других ответах хорошая работа дает настраиваемые сценарии и настройки в зависимости от вашей платформы. В дополнение к этим, вот зрелые, специальные программы, о которых я знаю:

  • JSW от TanukiSoftware
  • YAJSW является открытым исходным кодом клон из вышеперечисленного. Он написан на Java, и это процесс няни, который управляет дочерним процессом (ваш код) в соответствии с конфигурациями. Работает на windows / linux.
  • JSVC является родным приложением. Это также процесс няни, но он вызывает ваше дочернее приложение через JNI, а не как подпроцесс.
1
ответ дан Mori Bellamy 22 August 2018 в 03:16
поделиться

Из Справочное руководство по загрузке весны

Установка в качестве службы init.d (System V)

Просто добавьте символ jar в init.d для поддержки стандартных команд start, stop, restart и status. Предполагая, что у вас есть приложение Spring Boot, установленное в / var / myapp, для установки приложения Spring Boot в качестве службы init.d просто создайте символическую ссылку:

$ sudo ln -s /var/myapp/myapp.jar /etc/init.d/myapp

После установки вы можете запускать и останавливать обслуживание обычным способом. Например, в системе на базе Debian:

$ service myapp start

Если ваше приложение не запускается, проверьте файл журнала, записанный на /var/log/<appname>.log для ошибок.

< / blockquote>

Продолжайте чтение , чтобы узнать, как защитить развернутую службу.

После выполнения в письменной форме я обнаружил, что моя служба не запускается с этим сообщением об ошибке в logs: start-stop-daemon: непризнанная опция --no-close . И мне удалось исправить это, создав конфигурационный файл /var/myapp/myapp.conf со следующим содержимым

USE_START_STOP_DAEMON=false
0
ответ дан naXa 22 August 2018 в 03:16
поделиться

Чтобы запустить Java-код в качестве демона (службы), вы можете написать заглушку на основе JNI.

http://jnicookbook.owsiak.org/recipe-no-022/

для образца кода, основанного на JNI. В этом случае вы демонизируете код, который был запущен как Java, а основной цикл выполняется в C. Но также можно поместить основной цикл daemon в Java.

https: // github.com/mkowsiak/jnicookbook/tree/master/recipeNo029

Удачи с JNI!

1
ответ дан Oo.oO 22 August 2018 в 03:16
поделиться

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

Используйте screen для запуска вашего сервера, а затем отсоедините его до выхода из системы , это приведет к тому, что процесс будет запущен, затем вы можете снова подключиться в любой момент.

Рабочий процесс:

Запустить экран: screen

Запустите свой server: java -jar minecraft-server.jar

Отсоединить, нажав: Ctl-a, d

Повторно подключить: screen -r

Подробнее здесь: https://www.gnu.org/software/screen/manual/screen.html

9
ответ дан Peter Peterson 22 August 2018 в 03:16
поделиться

Вы можете использовать Thrift server или JMX для связи со службой Java.

1
ответ дан tienthanhakay 22 August 2018 в 03:16
поделиться

Простым решением является создание скрипта start.sh, который запускает Java через nohup, а затем сохраняет PID в файл:

nohup java -jar myapplication.jar > log.txt 2> errors.txt < /dev/null &
PID=$!
echo $PID > pid.txt

Тогда ваш стоп-скрипт stop.sh будет читать PID из файл и убить приложение:

PID=$(cat pid.txt)
kill $PID

Конечно, я не рассмотрел некоторые детали, например, проверить, существует ли процесс и удалить pid.txt, если вы закончили.

42
ответ дан Wernsey 22 August 2018 в 03:16
поделиться
  • 1
    Вопрос: Не будет ли команда kill $ PID убить процесс без завершения? Я пишу серверную программу, которая взаимодействует с базой данных, и я хочу, чтобы все текущие потоки выполнялись до выхода программы, чтобы гарантировать, что программа не умрет в середине записи в БД или что-то еще , – Scuba Steve 12 December 2013 в 06:29
  • 2
    @ scuba-steve. kill будет посылать сигнал TERM, который будет вызывать любые выключения, которые используются на месте, поэтому используйте их, чтобы закончить ваш процесс изящно. Они не будут выполняться, если процесс получает сигнал kill (т. Е. Kill -9). ОС может прерывать ваши выключения, если они слишком долго заканчиваются, поэтому держите их краткими – rjohnston 30 May 2014 в 05:44
5
ответ дан Community 5 November 2018 в 02:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: