Я пытаюсь выполнить некоторое управление процессом в скрипте (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?
Спасибо всем за ваши ответы. Я использовал предложение пикрова (или небольшой вариант: ps -o pgrp = $$, который подавляет заголовок), и поэтому принял его ответ - я полагаю, что другие подходы также являются правильными ответами. –
Не работает в Mac Terminal bash v3.2.57 (MacOS 10.13.2) –
@EgbertS, что «не работает» на OS X? Вызов _ps_? [Переносное обращение] (http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ps.html) будет «ps -o pgid = $$». (Однако OP, вероятно, использует Linux _ps_, который поддерживает спецификаторы нестандартного формата, такие как _pgrp_ и AIX _% r_.) – pilcrow