LINUX.ORG.RU
ФорумAdmin

systemd nifi unit

 ,


0

1

Всех приветствую!

Пишу сервис для запуска nifi, т.к не сильно подходит вариант запуска через родной script, хочется красиво.

Сам сервис, использую тип forking, т.к. при запуске nifi сразу создает pid файл и пораждает два процесса один из которых периодически может пропадать.

[Unit]
Description=nifi
After=network.target
Documentation=https://nifi.apache.org


[Service]
Type=forking
ExecStart=java -cp /var/lib/nifi/conf/:/var/lib/nifi/lib/bootstrap/* -Xms12m -Xmx24m -Dorg.apache.nifi.bootstrap.config.log.dir=/var/log/nifi/ -Dorg.apache.nifi.bootstrap.config.pid.dir=/var/run/nifi/ -Dorg.apache.nifi.bootstrap.config.file=/var/lib/nifi/conf/bootstrap.conf org.apache.nifi.bootstrap.RunNiFi run
ExecStop=java -cp /var/lib/nifi/conf/:/var/lib/nifi/lib/bootstrap/* -Xms12m -Xmx24m -Dorg.apache.nifi.bootstrap.config.log.dir=/var/log/nifi/ -Dorg.apache.nifi.bootstrap.config.pid.dir=/var/run/nifi/ -Dorg.apache.nifi.bootstrap.config.file=/var/lib/nifi/conf/bootstrap.conf org.apache.nifi.bootstrap.RunNiFi stop
User=nifi
Group=nifi
PIDFile=/var/run/nifi/nifi.pid
Restart=on-abort


[Install]
WantedBy=multi-user.target

Если использую конструкцию выше, то при старте висить около 30 сек и потом вылетает.

Если руками просто запустить используя строку запуска из ExecStart, то все ок.

Если тип юнита меняю на simple то запуск происходит, но сразу возникает вопрос, как отслеживать процессы.


Сам сервис, использую тип forking, т.к. при запуске nifi сразу создает pid файл и пораждает два процесса один из которых периодически может пропадать.

Так, можно ещё раз, кто на ком стоял?

intelfx ★★★★★ ()
Ответ на: комментарий от intelfx

ос - centos 7.

Сейчас сервис выглядит:

[Unit]
Description=nifi
After=network.target
Documentation=https://nifi.apache.org


[Service]
Type=forking
ExecStart=java -cp /var/lib/nifi/conf/:/var/lib/nifi/lib/bootstrap/* -Xms12m -Xmx24m -Dorg.apache.nifi.bootstrap.config.log.dir=/var/log/nifi/ -Dorg.apache.nifi.bootstrap.config.pid.dir=/var/run/nifi/ -Dorg.apache.nifi.bootstrap.config.file=/var/lib/nifi/conf/bootstrap.conf org.apache.nifi.bootstrap.RunNiFi run
ExecStop=java -cp /var/lib/nifi/conf/:/var/lib/nifi/lib/bootstrap/* -Xms12m -Xmx24m -Dorg.apache.nifi.bootstrap.config.log.dir=/var/log/nifi/ -Dorg.apache.nifi.bootstrap.config.pid.dir=/var/run/nifi/ -Dorg.apache.nifi.bootstrap.config.file=/var/lib/nifi/conf/bootstrap.conf org.apache.nifi.bootstrap.RunNiFi stop
User=nifi
Group=nifi
PIDFile=/var/run/nifi/nifi.pid
Restart=on-abort


[Install]
WantedBy=multi-user.target

Когда выполняю systemctl start nifi, то висит в течение 30 сек и отваливается, судя по логам просто идет завершение работы nifi без ошибок.

Если я меняю в разделе [Service] Type=forking на Type=simple, то nifi запускается без проблем. Но как тогда отслеживать пораждающиеся процессы.

sentoz ()
Ответ на: комментарий от sentoz

Подробнее расскажи про процессы. Кто кого порождает, что значит «периодически может пропадать» и т. п.

Когда выполняю systemctl start nifi, то висит в течение 30 сек и отваливается, судя по логам просто идет завершение работы nifi без ошибок.

Type=forking описывает случаи, когда процесс, непосредственно порождённый systemd («A»), порождает процесс «B», тот порождает «C», потом «B» завершается и «A» завершается, а полезную работу совершает процесс «C».

Это так называемый «двойной форк». Если твоя программа не совершает двойного форка (или хотя бы одинарного), Type=forking использовать некорректно и это будет приводить к симптомам, которые ты наблюдаешь.

Если я меняю в разделе [Service] Type=forking на Type=simple, то nifi запускается без проблем. Но как тогда отслеживать пораждающиеся процессы.

Если непосредственно порождённый systemd процесс «A» продолжает жить в течение всего времени работы сервиса, то это Type=simple, вне зависимости от того, сколько процессов и когда он порождает в свою очередь.

intelfx ★★★★★ ()
Ответ на: комментарий от intelfx

Type=forking описывает случаи, когда процесс, непосредственно порождённый systemd («A»), порождает процесс «B», тот порождает «C», потом «B» завершается и «A» завершается, а полезную работу совершает процесс «C».

Теперь стало понятнее)

Подробнее расскажи про процессы. Кто кого порождает, что значит «периодически может пропадать» и т. п.

При выполнение комманды systemctl start nifi или java -cp /var/lib/nifi/conf/:/var/lib/nifi/lib/bootstrap/* -Xms12m -Xmx24m -Dorg.apache.nifi.bootstrap.config.log.dir=/var/log/nifi/ -Dorg.apache.nifi.bootstrap.config.pid.dir=/var/run/nifi/ -Dorg.apache.nifi.bootstrap.config.file=/var/lib/nifi/conf/bootstrap.conf org.apache.nifi.bootstrap.RunNiFi run

Если посмотреть через ps aux | grep nifi(вывод команды ниже), видно два процесса, думал это подходит под концепцию Type=forking.

nifi        4104  7.5  3.0 2434680 57352 ?       Ssl  15:21   0:00 /usr/bin/java -cp /var/lib/nifi/conf/:/var/lib/nifi/lib/bootstrap/* -Xms12m -Xmx24m -Dorg.apache.nifi.bootstrap.config.log.dir=/var/log/nifi/ -Dorg.apache.nifi.bootstrap.config.pid.dir=/var/run/nifi/ -Dorg.apache.nifi.bootstrap.config.file=/var/lib/nifi/conf/bootstrap.conf org.apache.nifi.bootstrap.RunNiFi start

nifi        4118  132 16.4 2970892 306800 ?      Sl   15:21   0:06 java -classpath /var/lib/nifi/./conf:/var/lib/nifi/./lib/javax.servlet-api-3.1.0.jar:/var/lib/nifi/./lib/jcl-over-slf4j-1.7.30.jar:/var/lib/nifi/./lib/jetty-schemas-3.1.jar:/var/lib/nifi/./lib/jul-to-slf4j-1.7.30.jar:/var/lib/nifi/./lib/log4j-over-slf4j-1.7.30.jar:/var/lib/nifi/./lib/logback-classic-1.2.3.jar:/var/lib/nifi/./lib/logback-core-1.2.3.jar:/var/lib/nifi/./lib/nifi-api-1.11.4.jar:/var/lib/nifi/./lib/nifi-nar-utils-1.11.4.jar:/var/lib/nifi/./lib/nifi-framework-api-1.11.4.jar:/var/lib/nifi/./lib/nifi-properties-1.11.4.jar:/var/lib/nifi/./lib/nifi-runtime-1.11.4.jar:/var/lib/nifi/./lib/slf4j-api-1.7.30.jar -Dorg.apache.jasper.compiler.disablejsr199=true -Xmx512m -Xms512m -Djavax.security.auth.useSubjectCredsOnly=true -Djava.security.egd=file:/dev/urandom -Dsun.net.http.allowRestrictedHeaders=true -Djava.net.preferIPv4Stack=true -Djava.awt.headless=true -Djava.protocol.handler.pkgs=sun.net.www.protocol -Dzookeeper.admin.enableServer=false -Dnifi.properties.file.path=/var/lib/nifi/./conf/nifi.properties -Dnifi.bootstrap.listen.port=44847 -Dapp=NiFi -Dorg.apache.nifi.bootstrap.config.log.dir=/var/log/nifi/ org.apache.nifi.NiFi
sentoz ()
Ответ на: комментарий от sentoz

Что-то я не могу найти ни слова о том, как запускается этот NiFi и какие аргументы он принимает.

Верно понимаю, что ты запускаешь java ... org.apache.nifi.bootstrap.RunNiFi run, а он порождает java ... org.apache.nifi.bootstrap.RunNiFi start и вот уже он является основным долгоживущим процессом?

Или то, что ты запускаешь, и является долгоживущим процессом? Грубо говоря, если ты запускаешь его в консоли, он «отпускает» консоль и уходит в фон или висит на переднем плане?

intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 2 )
ExecStart=java

Так же не сработает - нужен полный путь. И type скорее всего у тебя нифига не forking.

Difrex ★★★★ ()
Ответ на: комментарий от intelfx

Или то, что ты запускаешь, и является долгоживущим процессом?

‘‘‘java … org.apache.nifi.bootstrap.RunNiFi start’’’

Если запустить просто в консоле, он остаётся висеть и не отпускает консоль, долгоживущий и есть.

sentoz ()
Ответ на: комментарий от Difrex

ExecStart=java Так же не сработает - нужен полный путь.

Сработает.

И type скорее всего у тебя нифига не forking.

Да у меня simple

sentoz ()
Ответ на: комментарий от sentoz

Сработает.

Хм, а с какой версии systemd не требует полный путь?

Difrex ★★★★ ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.