Как заставить файл jar работать при запуске и когда вы выходите из системы?

30

Понятия не имею, с чего начать. Я читал о демонах и не понял концепции.

Больше деталей:

  • Я пишу сканер, который никогда не останавливается и сканирует RSS в Интернете.
  • Гусеничный ход был написан на языке Java, поэтому сейчас это фляга.
  • Я администратор на машине с Ubuntu 11.04.
  • Есть вероятность того, что машина выйдет из строя, поэтому я бы хотел, чтобы сканер запускался при каждом запуске машины.
  • Кроме того, я бы хотел, чтобы он продолжал работать, даже когда я вышел из системы. Я не уверен, что это возможно, но большую часть времени я выхожу из системы, и я все еще хочу ползти.

Любые идеи? Может ли кто-нибудь указать мне правильное направление?

Просто ищу самое простое решение.

RanZilber
источник

Ответы:

32

Вот простой способ сделать это с помощью SysVInit. Инструкции:

  1. Создайте сценарий запуска и остановки вашего приложения. Поместите его в какой-нибудь каталог, в нашем примере это:

    • Начальный скрипт: /usr/local/bin/myapp-start.sh
    • Стоп скрипт: /usr/local/bin/myapp-stop.sh

    Каждый из них предоставит инструкции по запуску / остановке приложения. Например, myapp-start.shсодержимое может быть таким простым:

    #!/bin/bash
    
    java -jar myapp.jar 

    Для сценария остановки это может быть что-то вроде этого:

    #!/bin/bash
    # Grabs and kill a process from the pidlist that has the word myapp
    
    pid=`ps aux | grep myapp | awk '{print $2}'`
    kill -9 $pid
  2. Создайте следующий скрипт ( myscript) и включите его /etc/init.d.

    /etc/init.d/myscript содержание:

    #!/bin/bash
    # MyApp
    #
    # description: bla bla
    
    case $1 in
        start)
            /bin/bash /usr/local/bin/myapp-start.sh
        ;;
        stop)
            /bin/bash /usr/local/bin/myapp-stop.sh
        ;;
        restart)
            /bin/bash /usr/local/bin/myapp-stop.sh
            /bin/bash /usr/local/bin/myapp-start.sh
        ;;
    esac
    exit 0
  3. Поставьте скрипт для запуска с системой (используя SysV). Просто запустите следующую команду ( как root ):

    update-rc.d myscript defaults 

PS: я знаю, что Upstart великолепен, но я предпочитаю старую систему инициализации SysV.

Маркос Рорис Младший
источник
1
Но как система узнает, какой параметр будет использовать? Как установить, чтобы быть «начало». Попробовал тут и не получилось.
Джон Джон Пихлер
1
Это работает, но команда «service myapp start» не завершает команду.
Тобиа
Теперь, как использовать опции start | stop | restart в myscript?
Codevalley
Кроме того, даже после выполнения 3-х шагов, моя банка не работает при запуске. Вы уверены, что нам нужно изменить разрешения, путь или что-то в этом роде?
Codevalley
@Codevalley, как я уже говорил, этот метод предназначен для инициализации SysV. Чтобы использовать сервис или другую команду, вам нужно написать выскочку. Но если вы собираетесь это сделать, вы должны написать системный (поскольку он становится стандартом)
Маркос Рорис Джуниор
6

Да! Возможно. :) Upstart - это способ убедиться, что служба работает. Он имеет пять пакетов, все установлены по умолчанию:

  • Запустите утилиту init initel и initctl
  • upstart-logd предоставляет демон logd и файл определения задания для службы logd
  • upstart-compat-sysv предоставляет файлы определения задания для задач rc и инструментов перезагрузки, уровня запуска, завершения работы и telinit, которые обеспечивают совместимость с SysVinit
  • startup-tasks предоставляет файлы определения задания для задач запуска системы
  • system-services предоставляет файлы определения задания для tty-сервисов

Обучение очень приятное и оно того стоит. У Upstart есть веб-сайт: http://upstart.ubuntu.com/


источник
На веб-сайте Upstart по состоянию на 2019 год: «Проект находится только в режиме сопровождения. Никаких новых функций не разрабатывается, и общим советом будет переход на другую минимальную систему инициализации или systemd»
Nav
2

3 быстрых предложения ...

  1. Создайте сценарий S tart в /etc/rc3.d(многопользовательском режиме консоли) с соответствующими сценариями K ill /etc/rc.0и /etc/rc6.dубейте свою Java-программу контролируемым образом, когда система выключается (уровень запуска 0) или перезагружается (уровень запуска 6). См . Введение в уровни запуска .

    Возможно, вы сможете запустить свое Java-приложение на уровне выполнения 2 (rc2.d), но, как сканер, ему понадобится TCP / IP. Поэтому убедитесь, что ваш сетевой сервис доступен / запущен на уровне запуска 2 заранее. Сеть определенно на уровне запуска 3.

    /etc/init.dсодержит все актуальные сценарии запуска / уничтожения. /etc/rcN.dкаталоги просто содержат ссылки на них, с префиксом S или K, чтобы запускать или уничтожать их соответственно, на уровне выполнения N.

  2. crondЗапущенный процесс должен сохраняться между выходами из системы. Может быть, добавить его в свой crontab.

  3. Запущенный процесс nohupтакже должен сохраняться. Смотрите nohup: запускайте команду даже после выхода из системы .

    $ nohup java -jar myapp.jar &

    По умолчанию myapp.jarстандартный вывод будет идти в файл с именем ./nohup.outили, $HOME/nohup.outесли первый не доступен для записи.


источник
И когда я выйду из системы, он все еще будет работать в фоновом режиме?
RanZilber
0

Также имейте в виду, делая заявления с:

  update-rc.d myscript defaults 

Иметь права 0755 и использовать или получить перед вашим .sh путь. Допустим, ваш сценарий находится на /root/test.sh, вам нужно сначала перейти на CD /root/перед доступом test.sh.

Так что лучший способ - создать SH на init.d и изменить путь к нему shи выполнить его в функции запуска.

Şήøωў
источник
0

Самый простой способ - использовать supervisord. Пожалуйста, смотрите полную информацию на http://supervisord.org/

Вы также можете посмотреть более подробную информацию здесь:

Запуск исполняемого файла JAR при запуске системы

https://www.digitalocean.com/community/tutorials/how-to-install-and-manage-supervisor-on-ubuntu-and-debian-vps

Алан Томпсон
источник