명령 | awk | 실행 방법

명령 | awk | 실행 방법

ps ax | grep apache | awk '{ print "cat /proc/"$1"/status | grep State" }' 그래서 다음과 같은 결과를 출력하는 이 명령이 있습니다 .

cat /proc/9989/status | grep State 
cat /proc/9992/status | grep State 
cat /proc/9993/status | grep State 
cat /proc/9994/status | grep State 

하지만 저는 한발 더 나아가 이러한 일을 실행하고 싶습니다. 따라서 awk 명령 출력을 실행한 후 뭔가가 누락되었습니다. 비슷 | exec하거나 비슷한 것.

가능합니까?

답변1

정규식+매개변수방법:

pgrep apache | xargs -I {} grep State "/proc/{}/status"

샘플 출력은 다음과 같습니다.

State:  S (sleeping)
State:  S (sleeping)

답변2

현재 실행 중인 인스턴스의 현재 상태만 알면 apache많은 문제를 건너뛸 수 있습니다.

당신은 그것을 사용할 수 있습니다

$ pgrep apache | xargs -n 1 ps -o pid=,state= -p
12206 S
12821 S
12872 S
12873 S
13084 S

pgrep이는 실행 중인 모든 프로세스의 모든 PID를 가져오고 apache이를 에 제공하는 데 xargs사용 되며 지정된 PID의 상태를 xargs쿼리 ps하고 PID 목록과 현재 상태를 반환합니다.

마지막 =에는 열 머리글이 인쇄되지 않습니다 pid=.state=

단일 문자 상태 의미 목록을 보려면 ps시스템 설명서를 확인하세요.


위 명령은 /proc상태 정보가 다르게 표시될 수 있지만 Linux 파일 시스템이 없는 Unices에도 이식 가능합니다. 이는 테스트를 위해 OpenBSD에서 apache대체 되었습니다 ksh.

$ pgrep ksh | xargs -n 1 ps -opid=,state= -p
22007 INsp
94426 IN+p
46726 INsp
70684 INsp
 5224 INsp
 9116 SNsp

답변3

"exec" 대신 원하는 명령은 "sh"입니다. 귀하의 awk 프로그램은 쉘 스크립트를 출력하고 있으므로 이를 쉘에 입력하면 됩니다!

당신이 너무 많은 일을 하고 있다는 것을 암시하는 다른 대답은 정확합니다. 예를 들어 awk는 입력을 필터링할 수 있기 때문에 grep과 awk가 필요하지 않습니다.

답변4

icarus가 올바르게 말한 것처럼 명령을 셸에 파이프하는 것 외에도 awk셸 명령 자체를 실행할 수도 있습니다.

  ps ax | grep apache | awk '{ system("cat /proc/"$1"/status | grep State") }' 

cat그러나 RomanPerekhrest가 조용히 보여준 것처럼 grep파일을 읽을 수 있으므로 그럴 필요는 없습니다 .

  ps ax | grep apache | awk '{ system("grep State /proc/"$1"/status") }' 

그리고 두 번째 파일은 필요하지 않습니다. 파일을 읽고 정규식과 일치시킬 수 있기 grep때문입니다 .awk

 ps ax | grep apache | awk '{F="/proc"$1"/status"; 
      while((getline <F)>0) if(/State/) print; close(F)}'
 # if maxfiles is enough you don't need the close(F)

첫 번째도 아닙니다.

 ps ax | awk '/apache/{F="/proc"$1"/status"; 
      while((getline <F)>0) if(/State/) print; close(F)}'
 # ditto

그러나 축약형이긴 하지만 상태가 이미 출력되었으므로 /proc실제로 볼 필요는 없습니다 .ps

 ps ax | awk '/apache/{print $3}'
 # or print $1,$3 to include PID like Kusalananda's ps-based answer
 # or better check $5~/apache/ to avoid including processes that 
 # aren't _running_ apache but have apache in their _arguments_ 

관련 정보