티스토리 뷰

컴퓨터활용/티맥스

[프로프레임] tdlinit.sh

호주 멜번초이 2017.05.24 20:31

Tmax에서 기본 제공하는 tdlinit 명령은 $TDLDIR/mod/ 에 생성되어 있는 symbolic link 정보대로 .so 라이브러리를 복사하여 $TDLDIR/run/ 에 복사를 한 후에 메모리에 적재까지 하게 된다. tdlinit 명령을 실행하기 전에 반드시 Tmax를 내려야 한다. Tmax가 기동 중에 tdlinit 명령을 실행하게 되면 메모리에 올려져 사용되고 있을 라이브러리들은 삭제가 되지 않기 때문에 교체하는 과정에서 문제가 발생될 수 있다. tdlinit 은모듈 속 global function명과 run 하위의 실제 물리파일간의 hash 매핑정보를 Shared Memory에 적재하는 과정으로 제법 시간이 걸린다. 따라서 tdlinit -b 명령을 실행할 경우 $TMAXDIR/tdlcall/config/ 에 미리 백업해 둔 tdl.bak 파일을 읽어 load하므로 이 과정이 생략되므로 빠른 기동이 가능하다.   

각 업무별 lib 디렉토리에 존재하는 .so 파일을 모두 읽을 수 있는 유저는 프로프레임 관리자 계정이라고 가정했을 때 tdlinit 명령은 프로프레임 관리 계정으로만 실행하도록 허용하는 것이 좋다. 프로프레임관리자 계정인 지의 여부는 홈디렉토리 하위에 cfg/proframe.cfg 파일이 존재하는 지 여부로 판단하도록 하였다. 처음에 whoami 명령으로 현재 유저를 구한 다음에 식별하려고 하였으나 개발서버, 테스트서버, 운영서버에서 프로프레임 유저나 디렉토리 위치가 다를 수 있기 때문에 이 방법을 채택하였다. 

업무별 so파일을 tmax 유저가 모두 읽을 수 있는 권한이 보장되어 있다면 tmax 유저로 tdlinit 명령을 실행할 수도 있다. tmax down 후에 실행해야 하는 점을 감안하면 tmax 유저로 tdlinit 하는 것이 관리상 편할 수도 있다. 유저를 번갈아 가면서 작업하다가 보면 헷갈릴 수도 있기 때문이다.

예제 쉘 프로그램에서 로그파일을 수집할 때는 tee 명령을 사용하였다. 로그가 나오는 즉시 화면에 뿌림과 동시에 지정된 로그파일에도 쌓도록 하기 위함이다. Tmax에서 기본 제공하는 tdlinit 명령을 사용하면 되지 굳이 별도 쉘을 더 만들 필요가 있는 지는 프로젝트에서 판단하면 될 것이다. 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# **************************************** env definition ******************************************
# ------------------------------------------------------------------------------------------------ #
#  실행 환경 정의
# ------------------------------------------------------------------------------------------------ #
 
DATE=`date +%Y/%m/%d`
TIME=`date +%H:%M:%S`
DATE_TIME=`date +%Y%m%d_%H%M%S`
HOSTNAME=`hostname`
USER=`whoami`
LOG_HOME=$PFMLOGROOT/cshlog
LOG_FILE=tdlinit.log.$DATE_TIME
 
# Framework 관리자계정 체크
if [ ! -f ~/cfg/proframe.cfg ];then
    echo "${USER}는 tdlinit 사용가능한 Framework User가 아닙니다"
    exit 1
fi
 
# Tmax 다운시켰는지 확인
clh_cnt=`ps -ef | grep tmax | grep clh  | wc -l`
if [ clh_cnt -gt 0 ];then
    echo "Tmax 가 기동되어 있습니다. tmdown 후 사용하세요"
    exit 1
fi
 
# ------------------------------------------------------------------------------------------------ #
# MAIN 실행 
# ------------------------------------------------------------------------------------------------ #
echo "start `date` by ${USER}"  >  $LOG_HOME/$LOG_FILE
echo "---------------">> $LOG_HOME/$LOG_FILE
tdlinit 2>&1 | tee -a    $LOG_HOME/$LOG_FILE
echo "---------------">> $LOG_HOME/$LOG_FILE
echo "finish `date` " >> $LOG_HOME/$LOG_FILE
 
echo "logfile : $LOG_HOME/$LOG_FILE "
 
# **************************************** END of PROGRAM ******************************************
cs

설정한 곳에 잘 등록이 되었는 지는 ipcs[각주:1] 명령으로 확인이 가능하다. 등록한 사용자(owner)가 누구인지 쓰기 모드는 어떠한 지가 보여진다. 이 ipcs 명령으로 메모리를 공유하는 목록을 볼 수 있는데 메모리 공유 방법은 Message Queue, Shared Memory, Semaphore 가 있다.  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
[tmax/tdlcall/config] ipcs 
IPC status from /dev/mem as of Wed May 24 19:21:38 KORST 2017
T        ID     KEY        MODE       OWNER    GROUP
Message Queues:
q         0 0x4107001c -Rrw-rw----     root   printq
q         1 0x00007511 -Rrw-rw-rw-     tmax     tmax
q         2 0x00007512 -Rrw-rw-rw-     tmax     tmax
q         3 0x00007513 -Rrw-rw-rw-     tmax     tmax
q         4 0x00007514 -Rrw-rw-rw-     tmax     tmax
q         5 0x00007515 -Rrw-rw-rw-     tmax     tmax
q         6 0x00007516 -Rrw-rw-rw-     tmax     tmax
q         7 0x00007517 -Rrw-rw-rw-     tmax     tmax
q         8 0x00007518 -Rrw-rw-rw-     tmax     tmax
q         9 0x00007519 -Rrw-rw-rw-     tmax     tmax
q        10 0x0000751a -Rrw-rw-rw-     tmax     tmax
q        11 0x0000751b -Rrw-rw-rw-     tmax     tmax
q        12 0x0000751c -Rrw-rw-rw-     tmax     tmax
 
Shared Memory:
m   5242880 0x00074902 --rw-rw-rw-     tmax     tmax
m   2097153 0x0d02f6e6 --rw-rw----     root   system
m   1048578 0xffffffff D-rw-------      esb      mqm
m         3 0x00074903 --rw-rw-rw-     tmax     tmax
m         4 0x00074904 --rw-rw-rw-     tmax     tmax
m         5 0x0000f967 --rw-rw-rw-     tmax     tmax
m         6 0x0000f968 --rw-rw-rw-     tmax     tmax
m   6291463 0x00008101 --rw-rw-r--     tmax     tmax
m   2097160 0x00008102 --rw-rw-r--     tmax     tmax
m   6291465 0x00008103 --rw-rw-r--     tmax     tmax
m   2097162 0x00028190 --rw-rw-rw-     tmax     tmax
m        11 0x00074900 --rw-rw-rw-     tmax     tmax
m   5242892 0x00008100 --rw-rw-r--     tmax     tmax
Semaphores:
s   3145728 0x010050cb --ra-ra-r--     root   system
s         1 0x6202f6bc --ra-r--r--     root   system
s         2 0x4e02f623 --ra-ra----     root   printq
s         3 0x1502f623 --ra-ra----     root   printq
s         9 0xa1000008 --ra-ra-ra-      esb      mqm
s   1048597 0x0102f4f0 --ra-------     root   system
[tmax/tdlcall/config]
cs

$TMAXDIR/tdlcall/config/ 디렉토리에 존재하는 tdl.cfg 에 Shared Memory Key 번호가 지정되어 있다.   28190 번지에 지정된 것을 확인할 수 있다.  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[tmax/tdlcall/config] cat tdl.cfg
# shared memory version (1|1D|2|2D)
VERSION=2
# shared memory key
SHMKEY=0x28190
# shared memory and file creation permission
IPCPERM=0777
# number of dynamic loadable modules, rouded up to powers of 2
MAXMODULES=204800
# shared memory backup
BACKUP=/actappsvr/sol/tmax/tdlcall/config/tdl.bak
# path of a command file for searching export functions
#COMMAND=tdlcmd
[tmax/tdlcall/config]
cs

애써 올린 tdl 정보를 모두 싹 날리고 새로 작성하고자 할 때는 tdlrm  명령을 이용할 수 있다. tdlrm 명령을 실행하기 전에 tdlinit 를 누가 실행시켰었는지 owner 를 찾아야 한다. 이 때는 ipcs 명령을 이용할 수 있음을 위에서 언급하였다.

tdlinit 관련된 문서는 technet.tmaxsoft.com 에서 참고,   tdlinit 환경파일 관련하여 참고 :  http://m.blog.naver.com/ljw8014/70156310588

 

  1. ipcs -m , ipcs -s , ipcs -q 세가지 옵션 있다. 제거는 ipcrm 명령을 사용한다. [본문으로]
댓글
댓글쓰기 폼