Eu uso ps -ef | grep catalina | grep -v grep
para imprimir o processo do Tomcat em execução no sistema:
kshitiz 7099 1 0 May11 ? 00:02:29 /usr/lib/jvm/jdk1.8.0/bin/java -agentlib:jdwp=transport=dt_socket,suspend=y,address=localhost:38156 -Dcatalina.base=/home/kshitiz/Documents/workspaces/ggts/.metadata/.plugins/org.eclipse.wst.server.core/tmp1 -Dcatalina.home=/opt/tomcat-7.0.42 -Dwtp.deploy=/home/kshitiz/Documents/workspaces/ggts/.metadata/.plugins/org.eclipse.wst.server.core/tmp1/wtpwebapps -Djava.endorsed.dirs=/opt/tomcat-7.0.42/endorsed -Dfile.encoding=UTF-8 -classpath /opt/tomcat-7.0.42/bin/bootstrap.jar:/opt/tomcat-7.0.42/bin/tomcat-juli.jar:/usr/lib/jvm/jdk1.8.0/lib/tools.jar org.apache.catalina.startup.Bootstrap start
Então eu uso ps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}'
para extrair o ID do processo:
7099
Mas quando eu alia todo o comando alias tomcat_id="ps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}'"
e o uso via alias, ele imprime o texto inteiro e awk
parece não funcionar.
type tomcat_id
dá:
tomcat_id is aliased to `ps -ef | grep catalina | grep -v grep | awk -F' ' '{print }''
Responder1
Uma regra geral para aliases: se ficar muito complexo para um alias, use uma função.
tomcat_id () {
ps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}'
}
O problema com a definição do seu alias é que você errou na citação. A linha que define o alias é um comando shell e é analisada pelo shell. Como você usou aspas duplas e provavelmente não há parâmetros posicionais no momento (portanto, $2
expande para uma string vazia), o alias que você definiu é
ps -ef | grep catalina | grep -v grep | awk -F' ' '{print }'
A maneira fácil de definir um alias é usar aspas simples para a definição e evitar usar aspas simples no comando com alias. Enquanto estou nisso, removi -F " "
, que é o padrão de qualquer maneira (e um pouco estranho porque parece “um espaço”, mas significa “qualquer sequência de espaços em branco”).
alias tomcat_id='ps -ef | grep catalina | grep -v grep | awk "{print \$2}"'
Ou você pode usar '\''
para citar efetivamente uma aspa simples dentro de um literal entre aspas simples.
alias tomcat_id='ps -ef | grep catalina | grep -v grep | awk '\''{print \$2}'\'
Mas, como escrevi acima, use uma função, fica mais claro. Ou melhor, use a ferramenta adequada para o trabalho:
alias tomcat_id='pgrep catalina'
ou
alias tomcat_id='pidof catalina'
Responder2
A resposta do Gnouc é perfeitamente válida (é por isso que votei positivamente), mas gostaria de oferecer uma alternativa:
alias tomcat_id="ps -ef|awk '\$8 ~ /java/ && /catalina/ {print \$2}'"
a ideia aqui é que no nome do processo (campo 8) possamos encontrar java
e na linha como um todo devemos encontrar catalina
.
Então deixamos awk
fazer todo o trabalho de correspondência e impressão. Não há necessidade de se preocupar grep
;)
Então o significado:
$8 ~ /java/ && /catalina/ {print $2}
é combinar campo $8
com regex /java/
e combinar a linha inteira (também pode usar $0
explicitamente) com regex /catalina/
e se essas coisas forem verdadeiras, imprima field $2
. Lembre-se do que já foi afirmado na resposta do Gnouc: o separador padrão já é um espaço em branco. Não há necessidade de definir isso.
Responder3
Você deve escapar do cifrão no awk
comando:
alias tomcat_id="ps -ef | grep catalina | grep -v grep | awk '{print \$2}'"
E você não precisa usar -F' '
, awk
use espaços como campo padrão separado.