Идентификатор группы процессов в UNIX - PullRequest
1 голос
/ 14 июля 2010

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

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?

Ответы [ 4 ]

1 голос
/ 14 июля 2010

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

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

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

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

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

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

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

0 голосов
/ 14 июля 2010
ps ax -o '%p %r' | awk -vp=$$ '$0~p{print $2}'
0 голосов
/ 14 июля 2010

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

0 голосов
/ 14 июля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...