Ubuntu 시스템에서 현재 프로세스를 보는 방법을 알고 있습니다. 예를 들어, 하나를 실행 상태로 둘 수 있습니다 ping
.
ping localhost
그런 다음 다음을 수행하십시오.
$ ps -ef | grep ping
이는 다음을 나타냅니다.
user1 2875 1231 0 Feb08 ? 00:00:03 /usr/libexec/gsd-housekeeping
user2 96834 43257 0 14:21 pts/4 00:00:00 ping localhost
root 96837 63560 0 14:21 pts/1 00:00:00 grep --color=auto ping
하지만 명령은 어떻습니까 host
? 루프에서 실행하고 있습니다.
for i in {1..50000}; do host localhost; done
그런 다음 다음을 수행하십시오.
$ps aux | grep host
하지만 내가 얻는 것은 다음과 같습니다.
root 98021 63560 0 14:24 pts/1 00:00:00 grep --color=auto host
예, 루트로 시도해 보기도 했습니다! 물론 이름 확인자를 볼 수 있지만 항상 켜져 있습니다.
$ ps -ef | grep resolv
systemd+ 1015 1 0 Feb08 ? 00:00:17 /lib/systemd/systemd-resolved
host
나도 봐야 하지 않나 /usr/bin/host
?
그건 그렇고, 똑같습니다 ls
. 나는 이러한 명령이 약간 특별하고 "내장"되어 있다는 것을 알고 있지만 다른 프로세스처럼 취급될 것이라고 생각했습니다. cd
실제 실행 파일 과 다릅니다 . 나는 달려갔다 strace
:
execve("/usr/bin/host", ["host", "localhost"], 0x7ffdf51ee518 /* 58 vars */) = 0
brk(NULL) = 0x559cc809a000
arch_prctl(0x3001 /* ARCH_??? */, 0x7ffd20032c70) = -1 EINVAL (Invalid argument)
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
...
그것을 설명하는 어떤 것도 볼 수 없습니다. 내가 놓친 게 무엇입니까? ! 이해를 높이는 데 도움을 주셔서 감사합니다!
답변1
ping은 한 번 실행됩니다. 작업을 반복하기 위한 자체 내부 타이머가 있지만 동일한 프로세스는 횟수가 만료되거나 옵션에 따라 종료될 때까지 그대로 유지됩니다.
호스트는 내장 셸이 아닌 외부 명령이므로 하위 프로세스와는 아무런 관련이 없습니다. 하지만 완료하는 데 50,000번의 실행이 필요했습니다. 찾아 보면 ps | grep
프로세스 테이블에 있을 확률은 약 1% 정도이다. 루프에서 ps도 실행하면 결국 몇 가지 적중이 표시될 수 있습니다. 두 개의 진단 프로세스를 실행할 때 특정 스케줄러 제한으로 인해 프로세스 생성이 host
ps와 동기화되지 않을 수 있습니다 .