안녕하세요. ps -aux 명령어와 ps -ux 명령어의 출력값이 어떻게 다른지 출력하는 방법을 찾다가 이 글을 보게 되었습니다. 해당 방법은 Process substitution을 이용한 방법입니다. 이 문서에도 잘 나와 있으니 참고하시면 좋을 듯 싶습니다. 이게 어떻게 동작하는지 천천히 보도록 하겠습니다.

 

 


 제가 요구하는 바에 대한 답은 diff <(ps -aux) <(ps -ux)입니다. 이것이 어떻게 동작하는지 간단하게 strace로 추적해 보도록 하겠습니다.

 

 

 무엇인지 잘 모르겠지만, /proc/self/fd/11하고 /proc/self/fd/15가 인자로 들어와 버립니다. 이 둘의 정체가 무엇인지 모르겠습니다만, execve 함수의 설명과, man 페이지의 설명을 대조해 보면, /proc/self/fd/11과 /proc/self/fd/15는 비교할 파일들을 의미함을 알 수 있습니다.

 

 

 diff는 단지 file들을 인자로 받기 때문입니다. 문서를 잘 보시면, 2번째 인자는 ["ls", "-al"]과 같이 명령어 인자나 실행 파일의 인자들을 넘김을 유추할 수 있어요. 여기까지 내용을 잘 도식화 시켜 보시면 아래와 같습니다.

 

 

 이 둘의 정체가 무엇인지 모르겠지만, 어찌 되었던 파일 2개를 받는다. diff 명령어를 실행시키는 프로세스 이미지는 저 둘에 대한 것과, diff 명령어를 수행한다는 정보를 가져갑니다.

 

 

 그런데, 이 부분을 보시면, 다시 또 /proc/self/fd/11과 /proc/self/fd/15가 등장합니다. 뭔가 복잡해 보이는데요. 뒤에 붙은 =3과 =4를 보시면, /proc/self/fd/11을 넘겼을 때에는 3을 리턴했고, /proc/self/fd/15를 넘겼을 때에는 4를 리턴했음을 알 수 있습니다. 이 3과 4는 open 시스템 콜 문서에 따르면, 파일 디스크립터 번호임을 알 수 있습니다.

 

 이 상황을 도식화 해서 그려보면 아래와 같습니다.

 

 

 3번 fd는 /proc/self/fd/11과 연관되어 있고, 4번 fd는 /proc/self/fd/15와 연관되어 있습니다.

 

 

 그 다음에는 시스템 콜 read가 계속 호출이 되는데요. 앞에 3과 4는 fd를 의미합니다. 즉, /proc/self/fd/11과 /proc/self/fd/15에 있었던 내용을 읽었음을 알 수 있습니다.

 

 

 그렇다면, 해당 파일들에 어떤 내용들을 특정 프로세스가 썼을 거다라는 추측이 가능합니다.

 

 

 이 상황을 그림으로 다시 그려보면 위와 같습니다. ps -aux가 /proc/self/fd/11에 결과를 쓰고, ps -ux가 /proc/self/fd/15에 결과를 씁니다. 그리고 diff가 두 파일을 읽어 옵니다. 뭔가 파이프와 비슷한 거 같은데요. 데이터의 방향은 아래와 같습니다.

 

 

 ps -aux의 결과를 diff가 쓰고 있고, ps -ux의 결과 또한 diff가 쓰고 있습니다. named pipe를 보시면 도움이 될 듯 합니다.

 

 

 다음에, diff의 결과를 출력해야 하니, write 시스템 콜도 필요합니다. 이 부분은 크게 어렵지 않습니다.

 

 


ps -aux와 ps -ux의 출력값이 어떻게 다른지 출력하기 위한 명령어는 diff <(ps -aux) <(ps -ux)입니다. 입력해 보겠습니다.

 

 

 그러면 둘을 비교했을 때 다른 부분만 나타남을 알 수 있습니다. 여기서 빨간색 부분은 제거를 의미합니다. 왼쪽에 있지만 오른쪽에 없는 것을 의미합니다.

 

 

 초록색은 오른쪽에 있지만 왼쪽에 없는 것을 의미합니다.