Я довольно новичок в Linux

Мне нужно создать процесс Java, который является сиротой (а не дочерним процессом какого-либо процесса), и он должен быть либо сервисом, либо иметь уникальное имя процесса, чтобы я мог остановить его, когда захочу.

По сути, я пытаюсь заставить Gitlab развернуть Java-сервер из CI. Каждая сборка CI должна идентифицировать и уничтожить экземпляр сервера, если он уже запущен, и создать новый. (Сервер также должен работать как сирота, иначе сборка CI застревает в ожидании завершения работы сервера.)

Конечно, я могу просто убить все запущенные процессы Java, но я бы хотел более понятный способ, если у меня когда-нибудь будет запущен процесс Java, который не является сервером.

Я пытался создать псевдоним, но bash не видит его, пока не попробую псевдоним в терминале. (Как создать сервис в Ubuntu Upstart Я также попытался использовать функцию, вставив в .bashrc и .bash_aliases, следуя инструкциям из Как запустить псевдоним в сценарии оболочки? проверить, будет ли он работать как псевдоним и иметь собственное имя процесса, но он также не удался.

Я бы сделал сервис, но я новичок в Linux и не знаю как, плюс каталог, в котором хранится jar, меняется при каждой сборке. Я не знаю, как передать каталог службе, чтобы Java знала, что он работает.

1 ответ1

2

Традиционное решение Unix для этого заключается в том, чтобы сохранить PID в файле с известным именем в известном месте, а затем использовать содержимое этого файла при необходимости. Это часто, если не воображение, называется pid-файлом.

Например, когда запускается демон / служба sshd , его PID записывается в файл с именем sshd.pid . Позже, когда необходимо остановить sshd или дать сигнал на перенастройку, этот файл читается, и если sshd останавливается, файл удаляется. «Нормальное» расположение для pid-файла находится в /var/run но вы иногда находите более старые системы или программы, использующие /etc или даже / , и ничто не мешает вам использовать что-то вроде /home/testcontroller если хотите.

ДОБАВЛЕНО: либо создатель, запускающий процесс, должен написать свой pid-файл, либо сам процесс должен сделать это; некоторые программы делают последнее автоматически, но java не (и не может быть легко изменен), поэтому вам нужно первое. Я не знаю, и вы не говорите, как работает gitlab, но вы упоминаете bash; если он использует скрипт bash, которым вы управляете, который делает что-то более или менее похожее

$somejre/java -Xmx99G -Dsome=config -Dmore=config -jar $appjar some args & # & for nowait aka background

затем добавьте сразу после этого

echo $! >$somelocation/myjava.pid # $! is the PID the most recent 'nowait' process 

и когда вы хотите остановить его, самое позднее, прежде чем запускать новый, используя тот же файл, сделайте (с тем же идентификатором пользователя) что-то вроде

if [ -e $somewhere/myjava.pid ] && ps -p $(cat $somewhere/myjava.pid) >/dev/null
then kill $(cat $somewhere/myjava.pid); rm -f $somewhere/myjava.pid; fi
# the default signal (TERM) is usually enough for Java, but if not
# (perhaps after a brief wait) use something stronger like -KILL

Если кто-то использует Java, этот метод игнорирует их. Если вам нужно несколько процессов Java ВАШЕГО СОБСТВЕННОГО, назначьте отдельные имена файлов. Если у вас так много (может быть, сотен), что отдельные имена файлов не работают, у вас есть более сложная проблема.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .