экранный идентификатор процесса команды

экранный идентификатор процесса команды

Прежде всего, извините за мой плохой английский, я новичок в Linux.

Когда я это делаю, он может записать идентификатор процесса в pid-файл.

start () {
    echo -n "Starting someserver.jar: "

    java -jar /home/someserver/someserver.jar &
    echo $! > /home/hcserver/hcserver.pid
}

И знаю, что я использую эту команду, но она не может записать в PID-файл

start () {
    echo -n "Starting someserver.jar: "

    screen -S someserver java -jar /home/someserver/someserver.jar
    echo $! > /home/someserver/someserver.pid
}

Как я могу получить идентификатор процесса или исправить это?

Редактировать:

root@server:/home/someserver# ps -ef | grep java
root      4332     1  0 22:03 ?         SCREEN -S someserver java -jar /home/someserver/someserver.jar
root      4333  4332  0 22:03 pts/0     java -jar /home/someserver/someserver.jar
root      4363  3222  0 22:04 pts/3     grep java

Я хочу написать4333идентификатор процесса в файл pid

решение1

Не уверен на 100%, что понял ваш вопрос, но давайте попробуем:

$! будет работать из родительской оболочки, а не изнутри дочернего процесса

$! — фоновый процесс, screen — это не совсем фоновый процесс

Также screen -S не отсоединит экран, вам, вероятно, нужно больше параметров экрана, вы, вероятно, хотите что-то вроде

screen -dmS

также изнутри экрана вы можете попробовать $$ и $BASHPID

Вы можете найти pid экрана, используя

screen -list | grep someserver | cut -f1 -d'.' | sed 's/\W//g'

Уничтожение pid экрана должно также уничтожить все, что работает внутри экрана.

Если вы уверены, что pid отсоединенного экрана вам не подходит, попробуйте использовать pgrep, чтобы получить pid Java-компонентов.

решение2

Итак, вы пытаетесь заменить скрипт, который запускает длительную команду Java в фоновом режиме, на скрипт, который запускает ее на экране?

Я думаю, что на самом деле есть две проблемы с вашей попыткой screen. Во-первых, эта команда screen не выйдет/не перейдет в фоновый режим, пока не завершится команда java (или интерактивный пользователь не введет какие-то данные). Во-вторых, $!она не будет делать то, что вы хотите.

Чтобы правильно перевести экран в фоновый режим, используйте:

screen -d -m -S someserver java -jar /home/someserver/someserver.jar

Комбинация -d -mзапустит экран в отсоединенном (фоновом) состоянии, что обычно и требуется для скрипта запуска. Он автоматически выйдет и очистится, если процесс java завершится.

Итак, теперь, когда у вас есть экран, правильно отображённый на заднем плане во время запуска, вам всё ещё нужно получить pid процесса, чтобы вы могли управлять им (или, по крайней мере, останавливать). Но на самом деле довольно сложно захватить этот pid. Я думаю, вы могли бы сделать это с помощью некоторой комбинации парсинга screen -lsвывода, парсинга /proc/данных и/или парсинга psвывода, но это будет сложно. На данный момент, самое простое, что можно сделать, это использовать screenсебя для управления этим процессом. То есть, в вашей stop()процедуре, вместо того, чтобы убивать pid процесса Java, сделайте что-то вроде этого:

stop () {
  echo -n "Stopping someserver.jar: "
  screen -X -S someserver quit
}

Это даст указание сеансу экрана (который вы уже определили -Sранее) завершить все процессы, находящиеся под его контролем, и выйти.

Если вам действительно нужен идентификатор дочернего процесса, то подойдет что-то вроде этого:

cd /var/run/screen/S-$(whoami)
parentpid=$(ls *.someserver | cut -d. -f1)
pid=$(ps --ppid $parentpid -ho pid)

Связанный контент