실행하면 ipcs -m
다음 메시지가 나타납니다.
------ Shared Memory Segments --------
key shmid owner perms bytes nattch status
0x00000 38699014 user 700 8125440 2 dest
0x00072 2064391 root 444 1 0
0x00000 38830088 user 700 299112 2 dest
0x00000 38862857 user 700 181720 2 dest
0x00000 38895626 user 700 244776 2 dest
0x00000 38928395 user 700 156816 2 dest
내가 원하는 것은 이러한 공유 메모리를 사용하여 프로세스(id)를 얻는 것입니다. 어떻게 얻을 수 있나요?
답변1
ipcs -m -p
슈미드를 보여줘그리고이를 생성한 프로세스의 PID("cpid")입니다.
또한 "마지막 연산자" 또는 "lpid"라고 표시되어 있습니다. 그게 무엇인지 전혀 모릅니다(맨 페이지에는 이에 대한 내용이 나와 있지 않으므로 알아내려면 문서나 소스 코드를 파헤쳐야 합니다. 이는 미친 짓입니다. 에 대해 이야기하다!).
예를 들어, 내 시스템 중 하나(postgres 및 apache 등을 실행하는 경우)에서 다음을 수행합니다.
$ ipcs -m -p
------ Shared Memory Creator/Last-op PIDs --------
shmid owner cpid lpid
36 postgres 3155864 2367086
38 root 14452 2362481
(apache, pid 14452는 소유자 루트로 표시됩니다. 루트로 시작하지만 www-data
다른 프로세스를 미리 분기할 때 변경됩니다.)
이를 사용하여 awk
생성자 PID를 추출하고 xargs -n 1 pstree -p
해당 PID를 표시하는 PID 트리로 연결할 수 있습니다.
참고: pstree
한 번에 최대 하나의 PID 매개변수만 사용할 수 있으므로 xargs -n 1
각 PID에 대해 한 번씩 실행해야 합니다.pstree
pstree -A
예를 들어(ASCII 출력의 경우. 그렇지 않은 경우 터미널에서 약간 더 예쁘게 보일 수 있는 기본 선 그리기 문자를 사용하십시오 ):-A
$ ipcs -m -p | awk '$3 ~ /^[0-9]+$/ {print $3}' | xargs -n 1 pstree -A -p
postgres(3155864)-+-postgres(1610942)
|-postgres(1620056)
|-postgres(1761109)
|-postgres(1831225)
|-postgres(1931537)
|-postgres(2123512)
|-postgres(2284745)
|-postgres(2386392)
|-postgres(3155867)
|-postgres(3155868)
|-postgres(3155869)
|-postgres(3155870)
|-postgres(3155871)
|-postgres(3155872)
`-postgres(3159321)
apache2(14452)-+-apache2(141263)
|-apache2(762459)
|-apache2(856005)
|-apache2(856006)
|-apache2(856008)
|-apache2(856009)
|-apache2(856010)
|-apache2(856438)
|-apache2(1369957)
|-apache2(1777646)
|-apache2(1887781)
`-apache2(3746760)
원하는 경우 사후 처리(awk 또는 기타 도구 사용)하여 대괄호 내에서 PID만 추출할 수 있습니다.
그런데 출력 내용과 형식을 변경하는 데 사용할 수 있는 pstree
다양한 유용한 옵션( -u
show uid 변환 및 전체 명령줄 표시 포함)이 있습니다.-a
cpid 및 lpid에 대한 pstree를 표시해야 하는 경우 다음을 사용하십시오.
$ ipcs -m -p | awk '$3 ~ /^[0-9]+$/ {printf "%s\n%s\n", $3, $4}' | xargs -n 1 pstree -p