Назад | Перейти на главную страницу

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

Прежде всего, извините за мой плохой английский, и я новичок в 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

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

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

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

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

В -d -m combo запустит экран в обособленном (фоновом) состоянии, что обычно и требуется для сценария запуска. Он автоматически завершится и очистится, если завершится процесс 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)

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

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

$! предназначен для фонового процесса, экран не совсем фоновый процесс

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

screen -dmS

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

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

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

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

если вы уверены, что pid отсоединенного экрана недостаточно, чтобы вы попытались использовать pgrep, чтобы получить pid материала java