2016-11-01 3 views
0

У меня есть скрипт инициализации System V, который я разработал, который запускает программу Java. По какой-то причине, когда создается файл PID, он содержит несколько PID вместо одного.Несколько PID хранятся в PID-файле

Вот соответствующий код, который запускает службу и записывает в файл PID:

daemon --pidfile=$pidfile "$JAVA_CMD &" >> $logfile 2>&1 
RETVAL=$? 
usleep 500000 

if [ $RETVAL -eq 0 ]; then 
    touch "$lock" 

    PID=$(ps aux | grep -vE 'grep|runuser|bash' | grep <myservice> | awk '{print $2}') 

    echo $PID > $pidfile 

Когда я проверить команду ps aux... вручную, один возвращается строки. При запуске в качестве скрипта кажется, что этот вызов возвращает несколько PID.

Пример содержимого в PID-файле: 16601 16602 16609 16619 16690. 16619 - это фактический идентификатор процесса, найденный при ручном запуске команды ps aux..., упомянутой выше.

+1

Я хотел бы предложить, что вы удалите последнюю команду AWK и проверить, что происходит ... –

+1

Вы заинтересованы только в получении 'pid'. Вместо использования 'ps' используйте' pgrep'. Он возвращает только 'pid'. Попробуйте 'PID = $ (pgrep -f )'. Или возьмите ярлык. Не назначайте '$ PID'. Попробуйте 'pgrep -f > $ pidfile'. – alvits

ответ

1

Попробуйте обратить вспять ваши greps. Первый (-vE) может работать до запуска myservice. Grep для вашей службы, а затем отфильтровать нежелательные линии:

PID=$(ps aux | grep <myservice> | grep -vE 'grep|runuser|bash' | awk '{print $2}') 
Смежные вопросы