помогите узнать pid запускаемого процесса

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
EARL
мл. сержант
Сообщения: 85
Зарегистрирован: 2010-05-24 9:05:18
Откуда: Тамбов

помогите узнать pid запускаемого процесса

Непрочитанное сообщение EARL » 2011-08-03 20:59:19

есть rc скрипт

Код: Выделить всё

#!/bin/sh
#
# PROVIDE: minecraft
# REQUIRE: DAEMON
#

. /etc/rc.subr

name="minecraft"
rcvar=${name}_enable
stop_cmd=minecraft_stop
screen=/usr/local/bin/screen
java=/usr/local/bin/java
java_args="-Xincgc -Xmx1G -jar craftbukkit-0.0.1-SNAPSHOT.jar"
command=$screen
command_args="-A -m -d -S mine $java $java_args"

load_rc_config ${name}
eval ": \${${name}_enable:=\"NO\"}"


minecraft_stop()
{
pid=`ps -aux | grep diablo | grep -v grep | awk '{ print $2; }'`
if [ -z $pid ]; then
echo "$name not running?"
exit
fi
kill -15 $pid
echo "Stopping $name"
}

run_rc_command $1
Но в данном случае скрипт отказывается стартовать, если в списке процессов есть уже запущенный экземпляр screen. Поэтому хочу добавить функцию minecraft_start() и в ней запускать процесс, но только не понятно как узнать pid запущенного в screen процесса?

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: помогите узнать pid запускаемого процесса

Непрочитанное сообщение kpp » 2011-08-04 10:48:22

Получить PID screen-а, получить все процессы, родителем для кот. является PID screen-а, потом по каждому полученному пройти рекурсивно.
Так получится список процессов, предком которых является процесс screen.
Получить PPID (PID родителя) в ps ключ -j
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

Аватара пользователя
EARL
мл. сержант
Сообщения: 85
Зарегистрирован: 2010-05-24 9:05:18
Откуда: Тамбов

Re: помогите узнать pid запускаемого процесса

Непрочитанное сообщение EARL » 2011-08-04 13:13:16

Примерно понял идею. Попробую. Спасибо

Аватара пользователя
EARL
мл. сержант
Сообщения: 85
Зарегистрирован: 2010-05-24 9:05:18
Откуда: Тамбов

Re: помогите узнать pid запускаемого процесса

Непрочитанное сообщение EARL » 2011-08-04 15:52:02

Сделал так

Код: Выделить всё

#!/bin/sh
#
# PROVIDE: minecraft
# REQUIRE: DAEMON
#

. /etc/rc.subr

name="minecraft"
rcvar=${name}_enable
start_cmd=minecraft_start
stop_cmd=minecraft_stop
screen=/usr/local/bin/screen
java=/usr/local/bin/java
java_args="-Xincgc -Xmx1G -jar craftbukkit-0.0.1-SNAPSHOT.jar"
command=$screen
command_args="-A -m -d -S mine $java $java_args"

load_rc_config ${name}
eval ": \${${name}_enable:=\"NO\"}"


minecraft_start()
{
    user=$(eval echo "\${${name}_user}")
    pid=`ps -U $user | grep java | grep craftbukkit | awk '{ print $1; }'`
    if [ "$pid" = "" ]; then
        echo "Starting $name."
        dir=$(eval echo "\${${name}_chdir}")
        su -l $user -c "cd $dir && $command $command_args"
    else
        echo "$name already running? (pid=$pid)."
    fi
}

minecraft_stop()
{
    user=$(eval echo "\${${name}_user}")
    pid=`ps -U $user | grep java | grep craftbukkit | awk '{ print $1; }'`
    if [ "$pid" = "" ]; then
        echo "$name not running?"
    else
        echo "Stopping $name"
        kill -15 $pid
    fi
}

run_rc_command $1