리눅스 환경에서 작업하다 보면 실행 중이거나 종료된 프로세스의 정확한 실행 명령어가 기억나지 않는 경우가 흔합니다. 특히 시스템 관리나 장애 복구 과정에서 해당 프로세스를 재시작해야 할 때 원본 명령어를 찾는 것이 중요해집니다. 다행히도 Linux는 프로세스 생성 시의 명령 인자까지 기록하기 때문에, 이를 적절히 활용하면 원래의 실행 커맨드를 복원할 수 있습니다.
/proc 파일시스템을 이용한 명령어 추출
Linux 커널은 모든 실행 중인 프로세스에 대해 /proc/[PID] 디렉터리 아래에 다양한 정보를 제공합니다. 이 중 cmdline 파일에는 그 프로세스가 시작될 때 사용된 전체 명령줄이 공백 대신 null 문자(\0)로 구분되어 저장됩니다.
예를 들어, PID가 30205인 프로세스의 시작 명령어를 확인하려면 다음 단계를 따릅니다.
# 먼저 ps 명령어로 특정 PID를 가진 프로세스를 식별
ps -ef | grep 30205
# 출력 예시:
# root 30205 1 ... /usr/java/jdk1.8.0_201/bin/java -jar -Xmx1024m ...
이후 /proc/30205/cmdline 파일을 읽어 원본 명령어를 확인합니다. 단순히 cat으로 출력하면 인자들이 붙어서 나올 수 있으므로, 가독성을 위해 null 문자를 줄바꿈 또는 공백으로 변환하는 것이 좋습니다.
# cmdline 내용 확인 (가독성이 떨어짐)
cat /proc/30205/cmdline
# 개선된 방식: null 문자를 줄바꿈으로 치환하여 보기 쉽게 출력
tr '\0' ' ' < /proc/30205/cmdline && echo
# 또는 xargs를 사용해 깔끔하게 표시
xargs --null < /proc/30205/cmdline
출력 결과는 다음과 유사하게 나타납니다:
/usr/java/jdk1.8.0_201/bin/java -jar -Xdebug -Xnoagent -Xmx1024m -Xms1024m -XX:NewRatio=1 -XX:SurvivorRatio=8 -Dconfig.path=file:/xtwj/biz/xtwj-mall-goods-biz/;file:/xtwj/biz/common.properties
추가 팁: 다른 관련 파일 활용
- /proc/[PID]/environ: 프로세스가 사용한 환경 변수 목록을 포함하며, 이것 역시 null로 구분됩니다. 분석 시
tr '\0' '\n' < environ으로 처리 가능합니다. - /proc/[PID]/exe: 실행 파일의 심볼릭 링크입니다. 어떤 바이너리로 실행되었는지 빠르게 확인할 수 있습니다.
- /proc/[PID]/cwd: 프로세스가 시작된 작업 디렉터리를 가리킵니다.
history 명령어의 한계와 보완
일부 사용자는 셸의 history 명령어를 통해 이전에 입력한 명령어를 찾으려 하지만, 이 방법은 다음과 같은 제약이 있습니다:
- 히스토리 와이프 또는 세션 종료 시 기록 소실
- 자동 시작 스크립트나 시스템 서비스는 히스토리에 남지 않음
- 명령어 수정 후 재실행 시 오래된 기록만 존재할 수 있음
따라서 실시간으로 실행 중인 프로세스의 정확한 명령어를 얻기 위해서는 /proc/[PID]/cmdline 접근이 가장 신뢰할 수 있는 방법입니다.
요약
특정 프로세스의 전체 시작 명령어를 정확히 파악해야 할 때는 다음 절차를 권장합니다:
ps -ef또는pgrep로 대상 PID 식별/proc/[PID]/cmdline파일을tr또는xargs -0로 가독성 있게 출력- 필요 시
environ,cwd등을 함께 참조하여 실행 컨텍스트 파악