1

Добрый день всем,

Я пытаюсь написать скрипт bash, чтобы показать все процессы Java, однако я хотел бы, чтобы он отображался ниже.

 ps -p $PID -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS

Проблема с вышеупомянутым состоит в том, что он показывает только один конкретный PID.

Поэтому я хочу, чтобы ps aux|grep j\[a\]va получил PID каждого из них, а затем запустил каждый PID в приведенной выше команде.

РЕЗУЛЬТАТ:

 root@reinhardt-VirtualBox:/home/reinhardt# ps -p 1959 -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS
  PID MEMORY USER     GROUP    COMMAND         ARGS
 1959  13648 root     root     grep            grep --color=auto java

Я предполагаю, что какой-то цикл будет сделан как для цикла?

1 ответ1

0

Не там, где я могу это проверить, но это должно сработать. read - это стандартная часть сценариев оболочки, которая помещает что-то из stdin (который может быть потоком или устройством, таким как /dev /tty) в переменную. Тогда вы просто делаете цикл

ps auwwx | gawk '/[j]ava/{print $1}' | while read PID
do
    ps -p $PID -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS
done

Или проще, если в вашей UNIX есть pgrep:

pgrep java | while read PID
do
    ps -p $PID -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS
done

Иногда вы можете использовать xargs в подобных случаях. Помните, что по умолчанию xargs помещает группу аргументов в конце команды. Поэтому вам нужно кормить его по одному (с -n1) и размещать PID там, где вы хотите, с -i:

pgrep java | xargs -n1 -i{} ps -p {} -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS

(опять же, извиняюсь за неправильный синтаксис -i, я не могу сейчас проверить. Проверьте man-страницу, если она взорвется)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .