생각보다 현재 프로세스의 부모, 자식 프로세스를 봐야 하는 경우가 있습니다. 오늘은 pstree 명령어를 이용해서 특정 프로세스의 부모, 자식 프로세스를 빠르게 파악하는 방법을 알아봅시다.

 


 먼저, pstree는 process들의 tree를 보여줍니다. 옵션 몇 가지만 보고, 제가 실행하고 있는 장고 서버 프로세스의 부모, 자식 프로세스 들을 간단하게 보겠습니다. 

 

 

 -a는 command line arguments를 보여줍니다.

 

 

 -p는 PID를 보여줍니다. 그리고 -s는 부모들의 process들을 보여줍니다. 부모, 부모의 부모 등등. 계속 올라가면 루트가 있겠죠? 이제, 제가 8000번 포트로 띄워놓고 있는 장고 서버 프로세스를 보도록 하겠습니다.

 


 먼저 netstat 명령어를 이용해서 8000번 포트를 사용하고 있는 프로세스의 id를 얻어옵니다. 158380/python이라고 되어 있습니다. 무엇인지는 잘 모르겠지만, 파이썬과 관련된 프로세스 158380번이 8000번을 물고 있음을 알 수 있어요. 이제, pstree를 이용해서 pid가 158380번인 프로세스를 보도록 하겠습니다.

 

 

 보면, zsh에서 띄워놓은 python ./manage.py runserver가 있음을 알 수 있어요. 어? poetry run ./manage.py runserver로 띄워놓은 거 같은데 어떻게 된 걸까요? 중간에 뭐가 바뀌기라도 한 것일까요? 그리고, 프로세스 관계도를 보니, 158380의 부모의 pid는 158372임을 알 수 있어요. 158372에 대한 pstree를 보도록 하겠습니다.

 

 

 이것도 runserver를 argument로 준 무언가임을 알 수 있어요. 그러면, 158372와 158380 둘 중 하나는 reloader일 듯 합니다. 왜냐하면, 제가 runserver에 아무런 옵션을 주지 않고 실행하면, 프로세스가 2개 실행되는데, 그 중 하나가 리로더이기 때문입니다.

 

 

 reloader 없이 실행시키면 어떻게 그려질까요?

 

 


  8000 포트를 먹고 있는 프로세스 id는 159351입니다. pstree 명령어로 이 프로세스의 부모와 자식들에 대한 정보를 보겠습니다.

 

 아까와는 다르게, 159351번 하나만 떠 있음을 볼 수 있어요. noreload 옵션이 있고 없고의 차이점이라고 할 수 있어요. 그런데 여기서 하나 궁금한 것. 159355, 159356, 159357, 159358은 무엇일까요?

 

 

 ps에 e옵션과 L옵션을 주어서 조회해 봅시다. pid는 프로세스 번호 lwp는 light weight process를 의미합니다.

 

 

 밑으로 내려보면, 159355, 159356, 159357, 159358이 보이는데요. pid가 159351이라고 되어 있습니다. 한 프로세스 내에서 돌고 있는 경량 프로세스들이라고 해석할 수 있습니다.

 

 

 pstree가 없는 상황에서는 어떻게 하면 좋을까요? ubuntu 20.04에서는 -eo 옵션을 주면 됩니다. ps -eo pid,ppid는 프로세스 id와 ppid를 출력합니다. pid나 ppid가 159351인 프로세스에 대한 정보를 출력하려면, piping을 이용하면 됩니다.