2010-07-14 16 views
1

Я пытаюсь выполнить некоторое управление процессом в скрипте (bash). По этой причине я выводя идентификатор группы процессов текущего процесса в файл.Идентификатор группы процессов в UNIX

ps ax -o '%p %r'|perl -ne 'if ($_ =~ /\s*$$\s*(\d+)/) { print "$1"; exit; }' > $pgidfile 
nohup $JAVA_HOME/bin/java -cp somejar.jar some.java.Program & > /dev/null 2>&1 

Я также попытался:

ps ax -o '%p %r'|awk '/'"$$"' [0-9]+/ {print $2}' > $pgidfile 
nohup $JAVA_HOME/bin/java -cp somejar.jar some.java.Program & > /dev/null 2>&1 

Однако в обоих этих случаях файл (в $ pgidfile) кажется пустым. (Хотя в некоторых редких случаях он, похоже, имеет правильное значение.) Кроме того, просто запуск команд (для вывода идентификатора группы процессов - вариант 1 или вариант 2 выше) сам по командной строке, похоже, делает правильные вещи.

Было бы здорово, если бы кто-то может предложить решение вышеуказанной проблемы или ответа либо (или оба) из следующих вопросов:

1) Что такое предлагаемый способ получить идентификатор группы процесса, в оболочке или perl-скрипт?

2) Выполняет ли команда под nohup изменение выходного перенаправления предыдущих/последующих команд, которые не связаны с командой, выполненной с помощью nohup?

ответ

1

1) Каков предложенный способ получить идентификатор группы процесса в оболочке или perl-скрипте?

Улучшения вашего текущего подхода был бы сделать матчточного поля на PID вы заботитесь о. Любая необработанная техника регулярных выражений (например, ваш исходный пост) несет риск совпадения неправильной вещи. Если $$ случается 123, вы будете соответствовать ps выходным линиям для PIDs 1123, 1234 и т.д.

Теперь awk и perl оба очень хороши в поле обработки разделителей ввода (см perl's -a switch), но вы не» т должны сделать это, так как вы можете ограничить ps для всего процесса вы заботитесь о:

$ ps -o '%r' $$ | tail -n 1 > $pgfile 

Узнайте, как ваш ps можно сказать пропустить заголовки, и вы можете удалить tail из этого трубопровода.

2) Выполняет ли команда под nohup изменение выходного перенаправления предыдущих/последующих команд, не связанных с командой, выполненной с помощью nohup?

Нет. В вашем сценарии что-то еще не так.

+0

Спасибо всем за ваши ответы. Я использовал предложение пикрова (или небольшой вариант: ps -o pgrp = $$, который подавляет заголовок), и поэтому принял его ответ - я полагаю, что другие подходы также являются правильными ответами. –

+0

Не работает в Mac Terminal bash v3.2.57 (MacOS 10.13.2) –

+1

@EgbertS, что «не работает» на OS X? Вызов _ps_? [Переносное обращение] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ps.html) будет «ps -o pgid = $$». (Однако OP, вероятно, использует Linux _ps_, который поддерживает спецификаторы нестандартного формата, такие как _pgrp_ и AIX _% r_.) – pilcrow

0

Вместо того, чтобы прибегать к неудобным сценариям оболочки и ps, почему у вас нет вашей Java-программы для получения собственного pgid? В худшем случае вы можете сделать это в однострочном JNI-методе.

0
ps ax -o '%p %r' | awk -vp=$$ '$0~p{print $2}' 
+0

Я думаю, что вы хотите 'awk -vp = $$ '$ 1 == p {print $ 2}'', а не $$: = 123 совпадающие записи с PID 51230 или PGID 4123. – pilcrow

0

В Perl, вы можете получить реальную идентификатор группы процесса, с $( и его эффективный идентификатор группы с $(. См. perldoc perlvar.

+0

Исправление: эффективная группа '$) '. Кроме того, это не то, о чем спрашивает OP (группы процессов - PGID). Ваш ответ касается членства в группе процесса (GID). –

Смежные вопросы