Запуск программы с пользовательским именем процесса в Linux
Я довольно новичок в Linux
Мне нужно создать процесс Java, который является сиротой (а не дочерним процессом какого-либо процесса), и он должен быть либо сервисом, либо иметь уникальное имя процесса, чтобы я мог остановить его, когда захочу.
По сути, я пытаюсь заставить Gitlab развернуть Java-сервер из CI. Каждая сборка CI должна идентифицировать и уничтожить экземпляр сервера, если он уже запущен, и создать новый. (Сервер также должен работать как сирота, иначе сборка CI застревает в ожидании завершения работы сервера.)
Конечно, я могу просто убить все запущенные процессы Java, но я бы хотел более чистый способ, если у меня когда-нибудь будет запущен процесс Java, который не является сервером.
Я пытался создать псевдоним, но bash не видит его, пока не попробую псевдоним в терминале. ( Как создать сервис в Ubuntu Upstart Я также попытался использовать функцию, вставив в.bashrc и.bash_aliases, следуя инструкциям из Как запустить псевдоним в скрипте оболочки? Чтобы проверить, будет ли он работать как псевдоним и иметь пользовательский Имя процесса, но оно также не удалось.
Я бы сделал сервис, но я новичок в Linux и не знаю как, плюс каталог, в котором хранится jar, меняется при каждой сборке. Я не знаю, как передать каталог службе, чтобы Java знала, что она работает.
1 ответ
Традиционное решение 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 ВАШЕГО СОБСТВЕННОГО, назначьте отдельные имена файлов. Если у вас так много (может быть, сотен), что отдельные имена файлов не работают, у вас есть более сложная проблема.