ps -ef | grep catalina | grep -v grep
시스템에서 실행 중인 Tomcat 프로세스를 인쇄 하는 데 사용합니다 .
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
그런 다음 이를 사용하여 ps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}'
프로세스 ID를 추출합니다.
7099
그런데 전체 명령에 별칭을 추가 alias tomcat_id="ps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}'"
하고 별칭을 통해 사용하면 전체 텍스트가 인쇄되고 awk
작동하지 않는 것 같습니다.
type tomcat_id
다음을 제공합니다:
tomcat_id is aliased to `ps -ef | grep catalina | grep -v grep | awk -F' ' '{print }''
답변1
별칭에 대한 일반 규칙: 별칭이 별칭에 비해 너무 복잡하면 대신 함수를 사용하세요.
tomcat_id () {
ps -ef | grep catalina | grep -v grep | awk -F' ' '{print $2}'
}
별칭 정의의 문제는 잘못 인용했다는 것입니다. 별칭을 정의하는 줄은 쉘에 의해 구문 분석되는 쉘 명령입니다. 큰따옴표를 사용했고 당시에는 위치 인수가 없었을 것이므로(따라서 $2
빈 문자열로 확장됨) 정의한 별칭은 다음과 같습니다.
ps -ef | grep catalina | grep -v grep | awk -F' ' '{print }'
별칭을 정의하는 쉬운 방법은 정의에 작은따옴표를 사용하고 alias 명령에서 작은따옴표를 사용하지 않는 것입니다. 이 작업을 수행할 때 어쨌든 기본값인 을 제거했습니다 -F " "
("공백"처럼 보이지만 "공백의 시퀀스"를 의미하므로 약간 이상합니다).
alias tomcat_id='ps -ef | grep catalina | grep -v grep | awk "{print \$2}"'
또는 '\''
작은따옴표를 사용하여 작은따옴표 리터럴 내에서 효과적으로 인용할 수 있습니다.
alias tomcat_id='ps -ef | grep catalina | grep -v grep | awk '\''{print \$2}'\'
그러나 위에서 쓴 것처럼 함수를 사용하는 것이 훨씬 더 명확합니다. 또는 작업에 적합한 도구를 사용하십시오.
alias tomcat_id='pgrep catalina'
또는
alias tomcat_id='pidof catalina'
답변2
Gnouc의 답변은 완전히 유효하지만(그래서 제가 투표했습니다) 대안을 제시하고 싶습니다.
alias tomcat_id="ps -ef|awk '\$8 ~ /java/ && /catalina/ {print \$2}'"
여기서 아이디어는 프로세스 이름(필드 8) 내에서 을 찾을 수 있어야 java
하고 전체 라인에서 을 찾아야 한다는 것입니다 catalina
.
그래서 우리는 awk
모든 매칭과 인쇄 작업을 완료했습니다. 귀찮게 할 필요가 없습니다 grep
;)
그래서 그것은 다음을 의미합니다:
$8 ~ /java/ && /catalina/ {print $2}
정규식과 일치 하고 전체 줄(명시적으로 사용할 수도 있음)을 정규식과 일치시키고 해당 항목이 true인 경우 필드를 인쇄하는 $8
필드 입니다 . Gnouc가 답변에서 이미 말한 내용을 기억하세요. 기본 구분 기호는 이미 공백입니다. 이것을 정의할 필요가 없습니다./java/
$0
/catalina/
$2
답변3
다음 명령에서 달러 기호를 이스케이프 처리해야 합니다 awk
.
alias tomcat_id="ps -ef | grep catalina | grep -v grep | awk '{print \$2}'"
그리고 반드시 기본 필드 구분 기호로 공백을 사용할 -F' '
필요 는 없습니다 .awk