Як зробити так, щоб файл jar запускався під час запуску та коли виходили?


30

Я поняття не маю, з чого почати шукати. Я читав про демонів і не розумів концепції.

Детальніше :

  • Я писав сканер, який ніколи не зупиняється і сканує по RSS в Інтернеті.
  • Гусениця написана на java - тому її баночка зараз.
  • Я адміністратор машини, яка має Ubuntu 11.04.
  • Є кілька шансів на збій машини, тому я хотів би, щоб гусеничний запуск працював кожного разу при запуску машини.
  • Крім того, я хотів би, щоб він продовжував працювати, навіть коли я вийшов. Я не впевнений, що це можливо, але більшість часу я виходжу з системи, і я все одно хочу, щоб він повзав.

Будь-які ідеї? Чи може хтось вказати мені в правильному напрямку?

Просто шукаю найпростіше рішення.

Відповіді:


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 - це чудовий і бла-бла, але я надаю перевагу старій системі init SysV.


1
Але як система дізнається, який параметр використовуватиме? Як встановити "старт". Спробував тут і не вийшло.
Джон Джон Піхлер

1
Це працює, але команда "service myapp start" не виходить з команди.
Тобія

Тепер, як використовувати параметри start | stop | перезапуск у myscript?
Codevalley

Крім того, навіть зробивши 3 кроки, мій jar не працює при запуску. Ви впевнені, що нам потрібно змінити дозволи, шлях чи щось подібне?
Codevalley

@Codevalley, як я вже згадував, цей метод призначений для inits SysV. Щоб скористатися службою чи іншою командою, вам потрібно буде написати початкове завдання. Але якщо ви збираєтеся це робити, вам слід написати системний (оскільки він стає стандартом)
Маркос Роріз Молодший

6

Так! Можливо. :) Upstart - це шлях, щоб переконатися, що служба працює. У ньому є п'ять пакунків, усі встановлені за замовчуванням:

  • Оновіть утиліту демона та утиліту initctl
  • upstart-logd надає демону logd і файл визначення завдання для служби logd
  • upstart-compat-sysv надає файли визначення завдань для завдань rc та інструментів перезавантаження, запуску, вимкнення та telinit, що забезпечують сумісність із SysVinit
  • Запуск-завдання надає файли визначення завдання для завдань системи запуску
  • system-services надає файли визначення завдання для tty-сервісів

Навчання дуже приємне і воно того варте. У Upstart є веб-сайт: http://upstart.ubuntu.com/


На веб-сайті Upstart станом на 2019 рік: "Проект перебуває лише в режимі vzdržece. Ніяких нових функцій не розробляється, і загальною порадою було б перейти на іншу мінімальну систему init або systemd"
Nav

2

3 швидких пропозиції ...

  1. Створіть скрипт S tart у /etc/rc3.d(консольному режимі багатокористувача) з відповідними скриптами K/etc/rc.0 та /etc/rc6.dвбийте програму Java контрольованим чином, коли система вимикається (runevel 0) або перезавантажується (runlevel 6). Див . Вступ до Runlevels .

    Можливо, ви зможете запустити додаток Java у runlevel 2 (rc2.d), але, як сканер, йому знадобиться TCP / IP. Тому попередньо переконайтеся, що ваша мережева послуга доступна / запущена на рівні 2 заздалегідь. Мережа, безумовно, перебуває на рівні 3.

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

  2. Процес, який виконується, crondповинен зберігатись між виходами. Можливо, додайте його у свій кронтаб.

  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, спочатку слід перейти на компакт-диск, /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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.