파이썬 프로세스가 python3로만 보이는 문제 해결하기 — comm, cmdline, 그리고 setproctitle
서버에서
ss나ps로 포트를 확인했을 때 모든 파이썬 데몬이 똑같이python3로만 보여서 구분이 안 됐던 경험, 한 번쯤 있으실 겁니다. 이 글에서는 그 원인을 리눅스 커널 수준에서 짚어보고, 프로세스 이름을 의미 있는 이름으로 바꾸는 방법을 정리합니다.
1. 문제 상황
로컬에서 특정 포트(예: 8999)를 누가 쓰는지 확인해 봅니다.
$ ss -ltnp 'sport = :8999'
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 2048 127.0.0.1:8999 0.0.0.0:* users:(("python3",pid=1723,fd=6))
프로세스 이름이 그냥 python3 입니다. 파이썬으로 돌아가는 데몬이 여러 개라면 어느 것이 어느 것인지 구분할 수 없습니다. 실제로 어떤 스크립트인지 알려면 매번 이렇게 추가 조회를 해야 합니다.
$ ps -fp 1723
UID PID PPID ... CMD
ubuntu 1723 1395 ... /home/ubuntu/brave_shim/venv/bin/python3 /home/ubuntu/brave_shim/brave_shim.py
목표는 간단합니다. ss/ps에서 바로 brave_shim이라고 보이게 만드는 것.
2. 배경 지식: 프로세스 이름은 사실 "두 개"다
리눅스에서 프로세스 "이름"은 하나가 아니라 두 가지 개념이 섞여 있습니다. 이걸 구분하는 것이 이 문제의 핵심입니다.
2-1. comm — 커널이 들고 있는 짧은 이름
- 위치:
/proc/<PID>/comm - 커널 내부 구조체(
task_struct)에 저장되는 이름입니다. - 최대 15글자 (
TASK_COMM_LEN = 16, 마지막 1바이트는 널 종료 문자). - 기본값은 실행한 바이너리의 파일 이름입니다. 그래서 파이썬 스크립트를 실행하면 인터프리터 바이너리 이름인
python3가 됩니다. ss,netstat,top(기본),ps -o comm등이 이 값을 보여줍니다.
$ cat /proc/1723/comm
python3
2-2. cmdline — 실행 시 전달된 전체 명령행
- 위치:
/proc/<PID>/cmdline(인자들이 널 문자
