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_