Java Applications - Створення Init скриптів для Linux

Java Applications — Створення Init скриптів для Linux

При встановленні в Linux сторонніх програм написаних на Java виникає безліч питань, одне з них — як найзручніше керувати запуском/зупинкою/перевантаженням таких програм? В ідеалі хотілося б створити init-скрипти та додати їх до init системи Linux. Такий метод найправильніший з точки зору операційної системи Linux і зручний як для користувачів, так і для адмінів. Але реальність така, що більшість java-додатків поширюються у вигляді архівів у яких, у кращому разі, включені скрипти для запуску, налаштування, зупинки і ще чорт знає чого 🙂 У цій статті на прикладі програм Pentaho-BI/Pentaho-DI я вирішив показати як використовуючи java-wrapper створити init-скрипти для CentOS Linux для управління сервісом як від імені звичайного користувача, так і від root-а.

Спочатку розберемося із запуском Pentaho BI-Server, у нього є shell скрипти запуску та зупинки, залишилося тільки дотриматися всіх формальностей для додавання їх до init системи. У директорії/etc/init.d/ я створив такий файл:

] # cat /etc/init.d/pentaho #!/bin/sh ### BEGIN INIT INFO # Provides: start-pentaho stop-pentaho # Required-Start: network postgresql-9.3 # Required-Stop: postgresql-9.3 # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Description: Pentaho BA Server # ## END INIT INFO

case "$1" in "start" ) su - pentaho -c "/home/pentaho/biserver-ce/start-pentaho.sh" ;; "stop") su - pentaho -c "/home/pentaho/biserver-ce/stop-pentaho.sh" ;; * ) echo "Usage: $0 < start stop >" ;; esac exit 0 [ root @ pentahosrv

Даємо права на виконання:

] # chmod +x /etc/init.d/pentaho [ root @ pentahosrv

Додаємо скрипт до init-системи CentOS:

] # chkconfig --add pentaho

Перевіримо, що тепер у нас із автозапуском biserver-а:

] # chkconfig --list grep pentaho pentaho 0 :off 1 :off 2 :on 3 :on 4 :on 5 :on 6 :off [ root @ pentahosrv

Також, згідно з офіційною документацією, у файліstart-pentaho.sh потрібно змінити останній if з

Ну от тепер від користувача root можна рулювати сервісом biserver-ce стандартними засобами Linux

] # service pentaho start [ root @ pentahosrv

] # service pentaho stop [ root @ pentahosrv

] # service pentaho restart

Чудово! Те, чого я і хотів &#128578; Поїхали далі....

C Pentaho-DI ситуація трохи складніше тому що shell скриптів для запуску та зупинки сервісу в архіві з програмою немає (принаймні в CE версії). У такому випадку можна скористатися стороннім додатком java wrapper-ом. Їх існує безліч, я вибрав те, що нагуглилося першим, це був «Java Service Wrapper» Community Edition для Linux x86 64-bit від компанії Tanuki Software. CE Edition у Cent OS Linux. Data-Integration також як і Biserver запускатиметься від звичайного користувача pentaho. Робив як написано в офіційній документації. Ось листинг домашньої директорії користувача pentaho:

$ ls -l total 21424 drwxr-xr-x 2 pentaho pentaho 4096 Dec 9 12:02 biserver-ce drwxr-xr-x 2 pentaho pentaho 4096 Dec 9 12:02 data-integration drwxr-xr-x 3 pentaho pentaho 4096 Dec 9 16 : 16 install pentaho@pentahosrv:

В install лежать різні архіви з програмами, туди ж я скачав і java wrapper:

$ cd install pentaho @ pentahosrv:

/ install $ wget -c http://wrapper.tanukisoftware.com / download / 3.5.26 / wrapper-linux-x86- 64 -3.5.26.tar.gz

Тут же в директорії install розпакуємо java-wrapper:

/install$ tar xzvf wrapper-linux-x86- 64 -3.5.26.tar.gz

Далі йдуть необхідні кроки згідно з документацією:

/ install $ cp wrapper-linux-x86- 64 -3.5.26 / bin / wrapper .. / data-integration / launcher / pentaho @ pentahosrv:

/install $ cp wrapper-linux-x86- 64 -3.5.26 / src / bin / sh.script.in .. / data-integration / launcher /

Чому я скопіював заготівлю для init-скрипту та бінарник wrapper-а до директорії launcher? Тому що в цій директорії розміщено всі бінарники data-integration. Переходимо до директорії/home/pentaho/data-integration/launcher і дивимося що там є:

/install$cd../data-integration/launcher/ pentaho@pentahosrv:

/ data-integration / launcher$ ls -l total 400 -rw-r--r-- 1 pentaho pentaho 778 Oct 1 13 : 45 kettle.cfg.xml -rw-r-- r-- 1 pentaho pentaho 193 Oct 1 13 : 45 launcher.properties -rw-r--r-- 1 pentaho pentaho 14904 Sep 30 19 : 19 pentaho-application-launcher-5.2.0.0- 20 5>-rw-r--r-- 1 pentaho pentaho 69452 Dec 12 16 : 38 sh.script.in -rwxr-xr-x 1 pentaho pentaho 312520 Dec 12 16 : 37 wrapper pentaho @ :

Знову ж таки, згідно з документацією wrapper-а, нам потрібно заготівлю init-скрипта перейменувати. Ім'я скрипта має відповідати назві сервісу. Я вибрав -pentaho-di :

/data-integration/launcher$ mv sh.script.in pentaho-di

Відкриваємо файл для редагування:

/data-integration/launcher$ vim pentaho-di

і міняємо 2 параметри:

Ще раз лістинг директоріїlauncher:

/data-integration / launcher$ cd .. pentaho @ pentahosrv:

/ data-integration$ ls -l launcher / total 400 -rw-r--r-- 1 pentaho pentaho 778 Oct 1 13 : 45 kettle.cfg.xml -rw-r-- r-- 1 pentaho pentaho 193 Oct 1 13 : 45 launcher.properties -rw-r--r-- 1 pentaho pentaho 14904 Sep 30 19 : 19 pentaho-application-launcher-5.2.0.0- 20 5>-rw-r--r-- 1 pentaho pentaho 69454 Dec 12 16 : 42 pentaho-di -rwxr-xr-x 1 pentaho pentaho 312520 Dec 12 16 : 37 wrapper pentaho @ pentah

Даємо права на виконання майбутнього init-скрипту:

/data-integration$ chmod +x launcher / pentaho-di

Також, знову згідно з документацією, треба скопіювати необхідні бібліотеки:

/ data-integration $ cp .. / wrapper-linux-x86- 64 -3.5.26 / lib / libwrapper.so lib / pentaho @ pentahosrv:

/ data-integration $ cp .. / wrapper-linux-x86- 64 -3.5.26 / lib / wrapper.jar lib /

Ну і власне копіюємо заготівлю конфігу:

/ data-integration$ mkdir conf pentaho @ pentahosrv:

/ data-integration $ cp .. / wrapper-linux-x86- 64 -3.5.26 / src / conf / wrapper.conf.in conf / wrapper.conf pentaho @ pentahosrv:

Для логів бажано мати окрему директорію:

/data-integration$ mkdir logs

Тепер треба зрозуміти з якими опціями запускається наша програма. Для цього я подивився всередину скриптаcarte.sh :

/data-integration$ vim carte.sh . export OPT " $DIR /spoon.sh" -main org.pentaho.di.www.Carte "$@"

Тобто по суті запускається spoon.sh з додатковими опціями-main org.pentaho.di.www.Carte Дивимося що вspoon.sh:

Зрозуміло, що запуск хитрий і незрозумілий. Купа змінних заважає розумінню. Пробуємо просто зробити висновок на екран самого рядка запуску. Дляцього замість самого запуску зробимо echo його команди з параметрами:

тепер запускаємо аплікуху і дивимося висновок, нас цікавить останній рядок:

encoding =UTF-8 wrapper.lang.folder=.. / lang

set.PENTAHO_DI_HOME=/home/pentaho/data-integration

wrapper.java.command = java set.JAVA_HOME = / usr / java / jre1.7.0_67 wrapper.java.command = % JAVA_HOME % / bin / java

wrapper.java.classpath.1= % PENTAHO_DI_HOME %/ launcher / pentaho-application-launcher-5.2.0.0- 209 .jar wrapper.java.classpath.2= % PENTAHO_DI_HOME %/ lib /* .jar

wrapper.java.library.path.1=%PENTAHO_DI_HOME%/lib wrapper.java.library.path.2=%PENTAHO_DI_HOME%/libswt/linux/x86_64

wrapper.java.additional.1=-Dorg.mortbay.util.URI.charset=UTF-8 wrapper.java.additional.3=-XX: MaxPermSize =256m wrapper.java.additional.4= -Djava.library.path=%PENTAHO_DI_HOME%/libswt/linux/x86_64:%PENTAHO_DI_HOME%/lib

wrapper.app.parameter.1=org.pentaho.di.www.Carte wrapper.app.parameter.2= %PENTAHO_DI_HOME%/carte-config.xml

wrapper.logfile=../logs/wrapper.log

wrapper.check.deadlock=TRUE wrapper.check.deadlock.interval= 60 wrapper.check.deadlock.action=RESTART wrapper.check.deadlock.output=FULL

wrapper.filter.trigger.1000= [ Loaded java.lang.OutOfMemoryError wrapper.filter.action.1000=NONE wrapper.filter.trigger.1001=java.lang.OutOfMemoryError wrapper.filter. action.1001=RESTART wrapper.filter.message.1001=The JVM run out of memory.

wrapper.event.jvm_restart.email.body=The JVM was restarted.\n\nPlease check on its status.\n

Пробуємо запустити, зупинити програму:

/ data-integration$ launcher / pentaho-di start Starting Pentaho DI Server. Waiting for Pentaho DI Server. running: PID: 532 pentaho @ pentahosrv:

/ data-integration$ launcher / pentaho-di stop Stopping Pentaho DI Server. Stopped Pentaho DI Server. pentaho @ pentahosrv:

Ура! Вийшло! Також можна переглянути статус:

/ data-integration$ launcher / pentaho-di status Pentaho DI Server is not running. pentaho @ pentahosrv:

Не запущено, запускаємо і знову дивимося статус:

/ data-integration$ launcher / pentaho-di start Starting Pentaho DI Server. Waiting for Pentaho DI Server. running: PID: 6754 pentaho @ pentahosrv:

/ data-integration$ launcher / pentaho-di status Pentaho DI Server is running: PID: 6754 , Wrapper:STARTED, Java:STARTED pentaho @ pentahosrv:

Тепер створимо init-скрипт/etc/init.d/pentaho-di :

#!/bin/sh ### BEGIN INIT INFO # Provides: pentaho-di # Required-Start: network postgresql-9.3 pentaho # Required-Stop: postgresql-9.3 # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Description: Pentaho DI Server ### END INIT INFO

case "$1" in "start" ) su - pentaho -c "/home/pentaho/data-integration/launcher/pentaho-di start" ;; "stop" ) su - pentaho -c "/home/pentaho/data-integration/launcher/pentaho-di stop" ;; "restart" ) su - pentaho -c "/home/pentaho/data-integration/launcher/pentaho-di restart" ;; "status") su - pentaho -c "/home/pentaho/data-integration/launcher/pentaho-di status" ;; * ) echo "Usage: $0 < start stop restart status >" ;; esac exit 0

Ну і додаємо його в автозавантаження:

] # chkconfig --add pentaho-di [ root @ pentahosrv

] # chkconfig --list grep pentaho pentaho 0 :off 1 :off 2 :on 3 :on 4 :on5 :on 6 :off pentaho-di 0 :off 1 :off 2 :on 3 :on 4 :on 5 :on 6 :off [ root @ pentahosrv

Тепер залишилося дати права користувачеві pentaho керувати сервісами. Тобто, щоб даний користувач міг сам перевантажити сервіс не напружуючи адміна. Для цього в кофізі sudo /etc/sudoers додамо такий рядок:

Тепер користувач pentaho використовуючи sudo зможе запустити, зупинити, перезапустити 2 сервіси: pentaho і pentaho-di Ось і все! Із завданням ми впоралися!