일반적으로 자바 프로세스를 확인하려면, ps 또는 jps를 사용한다.
$ ps -e | grep java
$ jps
중요한 내용만 보고 싶다면, jps -ml을 사용하여 알 수 있다.
$ jps -ml | grep 4822
4822 google.server.Server --http.port=8001
프로세스(process) 이름을 길게 얻으려면 다양한 방밥이 있는데, 간단하게 (efw) 옵션을 주거나 /proc/밑의 cmdline으로 알 수 있다.
$ ps -efw | grep java
$ cat /proc/${PID}/cmdline
하지만, 너무 classpath가 너무 많아서 command line이 너무 길면 결국 얻어올 수 없다. (커널레벨의 제한이 있다)
command line을 ps또는 /proc/${PID}/cmdline에서 볼 수 있도록 하려면, http://stackoverflow.com/questions/199130/how-do-i-increase-the-proc-pid-cmdline-4096-byte-limit의 내용처럼 PAGE_SIZE를 수정하고 컴파일해야 한다고 한다.
centos 6,7(kernel 3.12전)에서 적용된 base.c 소스
http://lxr.free-electrons.com/source/fs/proc/base.c?v=2.4.37
하지만, 리눅스 커널 4.2가 설치된 버전에서는 완전한 커맨드를 사용할 수 있다.
- proc: fix PAGE_SIZE limit of /proc/$PID/cmdline (Alexey Dobriyan)
https://patchwork.kernel.org/patch/6191541/
http://www.serverphorums.com/read.php?12,1179056
http://lxr.free-electrons.com/source/fs/proc/base.c?v=4.2
* 참고로, 일부 centos 버전에서는 모두 볼 수 있다.
최근에 장비에 2.6.32-642.11.1el6.centos.plus 버전이 깔려 있는데, ps 커맨드 실행시 프로세스 이름을 한 줄로 보여주고 있다.
$ uname -r
2.6.32-642.11.1.el6.centos.plus.x86_64
http://centos.yourname.nl/centos/6/centosplus/Source/SPackages/에서
rpm 를 설치한다.
$ sudo rpm -ivh kernel-2.6.32-642.11.1.el6.centos.plus.src.rpm
rpmbuild 디렉토리에 SOURCES와 SPECS가 존재한다. kernel.spec 파일에 패치된 내용이 존재한다.
./SPECS/kernel.spec:- [fs] proc: fix PAGE_SIZE limit of /proc/$PID/cmdline (Jarod Wilson) [1100069]
커널 소스를 풀어본다.
$ rpm2cpio kernel-2.6.32-642.11.1.el6.centos.plus.src.rpm | cpio -idmv
$ tar xvf linux-2.6.32-642.11.1.el6.tar.bz2
$ cd linux-2.6.32-642.11.1.el6
$ vi ./fs/proc/base.c
바뀐 내용을 확인할 수 있다.
* 소스
다운받은 소스 또는 http://lxr.free-electrons.com/source/fs/proc/base.c?v=4.2#L199를 참조한다.
특별히 볼 소스는 다음과 같다.
199 static ssize_t proc_pid_cmdline_read(struct file *file, char __user *buf, 200 size_t _count, loff_t *pos)
include/linux/mm_types.h에 있는 mm_struct과 base.c를 살펴보면, 프로세스 영역으로 들어가
매개변수가 들어가는 공간을 확인한다(len1, len2)
code & data 영역(access_remote_vm)에 들어갈 공간에 데이터가 없다면, 최대 PAGE_SIZE안의 데이터를 매개변수로 받는다. (아마도 PAGE_SIZE보다 작은 매개변수 값들) code 영역에 들어간 공간 정도로 엄청 긴 것은 계속 code &data 영역에서 계속 매개변수를 읽도록 한다. 결국은 매개변수를 다 채워서 리턴하는 코드이다.
'unix and linux' 카테고리의 다른 글
쉘에서 여러 진수의 값을 10진수로 변환하기 (0) | 2017.01.04 |
---|---|
centos 7 공식 문서 (0) | 2017.01.04 |
[centos] rpm is not signed 해결하기 (0) | 2017.01.03 |
[grafana] 자바 모니터링 (java monitoring) (0) | 2016.12.30 |
grep 없이 여러 데몬 kill하기 (0) | 2016.12.30 |