Bom dia a todos,
Estou tentando escrever um script bash para mostrar todos os processos de java, mas gostaria que fosse exibido da maneira abaixo.
ps -p $PID -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS
O problema acima é que ele mostra apenas um PID específico.
Então, quero ps aux|grep j\[a\]va
obter o PID de cada um e executar cada PID no comando acima.
RESULTADO:
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
Eu acho que algum tipo de loop será feito como for loop?
Responder1
Não em um lugar onde eu possa testar isso, mas deve funcionar. read
é uma parte padrão do script de shell, ele coloca algo do stdin (que pode ser um fluxo ou um dispositivo como /dev/tty) em uma variável. Então você apenas faz um loop 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
Ou mais simplesmente, se o seu UNIX tiver pgrep:
pgrep java | while read PID
do
ps -p $PID -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS
done
Às vezes você pode usar xargs
em casos como esses. Lembre-se de que, por padrão, xargs coloca um grupo de argumentos no final do comando. Então você precisa alimentá-lo um de cada vez (com -n1) e colocar o PID onde quiser, com -i:
pgrep java | xargs -n1 -i{} ps -p {} -o pid,vsz=MEMORY -o user,group=GROUP -o comm,args=ARGS
(novamente, peço desculpas se eu errar a sintaxe -i, não posso testar agora. Verifique a página de manual se isso explodir)