Добрый день всем!
Я пытаюсь написать 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
Я предполагаю, что будет создан какой-то цикл, вроде цикла for?
решение1
Не в том месте, где я могу это проверить, но это должно работать. read
это стандартная часть скриптинга оболочки, она помещает что-то из stdin (который может быть потоком или устройством, таким как /dev/tty) в переменную. Затем вы просто делаете цикл while
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-страницу, если что-то пойдет не так)