컴퓨터활용/유닉스

ipcs, ipcrm 으로 공유메모리 삭제 방법

멜번초이 2018. 4. 25. 21:54

프로프레임에서 사용하는 쉐어드메모리는 TDL 과 Tcache 가 있다. 보통 이것은 티맥스 유저보다는 프로프레임 유저로 생성한다. 어느 유저로 생성하던 지간에 tdlinit  명령을 실행할 때는 tmdown 상태에서 하는 것이 좋다.

생성된 공유메모리가 제대로 해제 되지 못 한 경우에 강제로 삭제하는 방법은 ipcrm 명령을 사용한다. 삭제하기 전에 ipcs 명령으로 현재 생성되어 있는 키값을 조회한다.  많기 때문에 user 로 grep 하여 범위를 줄여서 보면 쉽게 찾아 낼 수 있다.  아래 예제는 75000번을 키로해서 생성된 메모리를 삭제하는 절차를 보여주고 있다.

문제의 키값을 찾았으면 ipcrm 명령으로 지워 주자. 쉐어드메모리 키는 생성한 유저로 삭제할 수 있다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[tmax@dev03:/tmax]$ ipcs -ma  | grep tmax
m  27262992 0x0000abe0 --rw------- proframe     tmax proframe     tmax      6     44324 1032362 2723932 17:00:56 no-entry 17:00:55
132120597 0x00075000 --rw-rw-rw- tmax         tmax tmax         tmax      0   3276824 1482804 831620 20:00:02 21:18:00 16:14:01
m  50331681 0x0000abe1 --rw------- proframe     tmax proframe     tmax      6     19692 1032362 2723932 17:00:56 no-entry 17:00:55
m  85983266 0x0000abe2 --rw------- proframe     tmax proframe     tmax      6     63296 1032362 2723932 17:00:56 no-entry 17:00:55
[tmax@dev03:/tmax]$
[tmax@dev03:/tmax]$
[tmax@dev03:/tmax]$ ipcrm -132120597
[tmax@dev03:/tmax]$ tmboot
[tmax@dev03:/tmax]$
[tmax@dev03:/tmax]$ ipcs -ma  | grep tmax
m  27262992 0x0000abe0 --rw------- proframe     tmax proframe     tmax      6     44324 1032362 2723932 17:00:56 no-entry 17:00:55
m  50331681 0x0000abe1 --rw------- proframe     tmax proframe     tmax      6     19692 1032362 2723932 17:00:56 no-entry 17:00:55
m  85983266 0x0000abe2 --rw------- proframe     tmax proframe     tmax      6     63296 1032362 2723932 17:00:56 no-entry 17:00:55
[tmax@dev03:/tmax]$
 
cs


참고로  ipcs명령으로 세마포어도 관리할 수 있다.

proframe 유저로 생성된  공유메모리를 찾아서 강제 삭제하는 쉘 프로그램은  다음과 같다.


■ Shared Memory 해제 
ipcs -m | grep proframe | awk '{print $2}' | while read line ; do ipcrm -m $line; done 

■ Semaphore 해제 
ipcs -s | grep proframe | awk '{print $2}' | while read line ; do ipcrm -s $line; done


간혹 ipcrm으로 제거를 시도 했을 경우 해당 공유메모리 ID가 존재하지 않는다고 나올 때가 있다. 이때에는 ipcs로 보면 해당 공유메모리의 속성에 D가 붙어 있을 것이다. 이것은 지워질 예정이라는 표시로, 해당 공유메모리에서 모든 접근이 사라질 때에 지워진다. 해당 공유메모리를 사용하는 프로세스가  죽어야 공유메모리도 삭제된다.