컴퓨터활용/프로프레임

[프로프레임] dlupdate 상태확인 쉘

멜번초이 2017. 6. 18. 06:17
반응형

프로프레임에서 사용하는 dlupdate 는 정말 유용하다. 유닉스C  에서 자바에서와 같이 실시간 모듈이 동적으로 반영될 수 있기 때문이다. 이렇게 dlupdate 된 모듈이 잘 메모리에 적재가 되었는 지 체크하는 쉘이 있어 소개한다.

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
pt_msg ()
{
    echo "\t $@"
}
 
err_msg ()
{
    echo "\t (E) $@"
}
 
warn_msg ()
{
    echo "\t (W) $@"
}
 
 
check_dlupdate_library()
{
    IN_FILE_FULL_NM=$1
    IN_FUNC_NM=`basename $IN_FILE_FULL_NM .so | cut -b4-`
 
    # chek argument
    if [ `echo "$IN_FILE_FULL_NM" | grep "^/" | wc -l` -ne 1 ]; then
        err_msg "input 파일명은 전체경로(full path)를 입력해야 합니다."
        exit 1
    fi
 
    if [ ! -"$IN_FILE_FULL_NM" ]; then
        err_msg "입력파일이 존재하지 않습니다."
        exit 1
    fi
 
    echo " o Checking ...  $IN_FILE_FULL_NM "
 
    # shared object
    file $IN_FILE_FULL_NM | grep "64-bit XCOFF executable" > /dev/null 2> /dev/null
    if [ $? -ne 0 ]; then
        err_msg "해당 파일은 64 shared object file 이 아닙니다."
        err_msg "(조치) rm -f $TDLDIR/mod/$IN_FUNC_NM.so"
        exit 2
    else
        pt_msg "(정상항목) 64 shared object file 입니다. "
    fi
 
    # tdl seq check 
    TDL_SEQ=`tdlshm -M $IN_FUNC_NM | grep "Libname" | awk '{printf "%s\n", $12}'|sort|uniq|cut -d, -f1`
    if [[ $? -ne 0 || $TDL_SEQ = "" ]]; then
        warn_msg "해당 파일은 현재 DLUPDATE 되어 있지 않습니다."
        warn_msg "일반 배치프로그램인 경우에는 하지 않으셔도 됩니다."
        warn_msg "만일 서비스나 2PC 배치, 상주배치인 경우 아래의 조치를 취하세요"
        warn_msg "(조치) 1. tdlinit 이 되어 있는지 확인하십시요"
        warn_msg "(조치) 2. dlupdate $IN_FILE_FULL_NM"
        exit 3
    else
        pt_msg "(정상항목) 현재 dlupdate 되어 있습니다. "
    fi
 
    # compare library
    sum1=`sum -r $IN_FILE_FULL_NM | awk '{print $1}'`
    sum2=`sum -r $TDL_RUN_DIR/$IN_FUNC_NM.$TDL_SEQ | awk '{print $1}'`
    if [ $sum1 -ne $sum2 ]; then
        err_msg "DLCALL 과 RELEASE 된 LIBRARY 가 다릅니다. "
        ls -l $IN_FILE_FULL_NM
        ls -l $TDL_RUN_DIR/$IN_FUNC_NM.$TDL_SEQ
        err_msg "(조치) dlupdate $IN_FILE_FULL_NM"
        exit 4
    else
        pt_msg "(정상항목) DLCALL 과 RELEASE 된 라이브러리가 동일합니다.  "
    fi
 
    # compare symboic link
    if [ ! -"$TDL_LNK_DIR/$IN_FUNC_NM.so" ]; then
        err_msg " [$TDL_LNK_DIR] 에 symboic link 가 존재하지 않습니다"
        err_msg "(조치) ln -s $IN_FILE_FULL_NM $TDL_LNK_DIR/$IN_FUNC_NM.so"
        exit 5
    else
        pt_msg "(정상항목) [$TDL_LNK_DIR] 에 symboic link 가 존재합니다"
    fi
 
 
    # link 가 지정하는 라이브러리 체크
    LINK_FILE_INFO=`ls -l $TDL_LNK_DIR/$IN_FUNC_NM.so 2> /dev/null | awk '{ print $NF } '`
    if [[ $? -ne 0  || "$IN_FILE_FULL_NM" != "$LINK_FILE_INFO" ]]; then
        err_msg "symboic link 와 입력된 library의 위치가 일치하지 않습니다."
        err_msg "(조치) rm -f $TDL_LNK_DIR/$IN_FUNC_NM.so"
        err_msg "(조치) ln -s $IN_FILE_FULL_NM $TDL_LNK_DIR/$IN_FUNC_NM.so"
        ls -l $TDL_LNK_DIR/$IN_FUNC_NM.so
        exit 6
    else
        pt_msg "(정상항목) symboic link 와 입력된 library 의 위치가 동일합니다. "
    fi
 
    # symbol check
    c=`nm -g $TDL_RUN_DIR/$IN_FUNC_NM.$TDL_SEQ | grep $IN_FUNC_NM | grep " D " | wc -l`
    if [ $c -eq 0 ]; then
        err_msg "library 의 dlcall symbol 명이 존재하지 않습니다."
        err_msg "(조치) nm -g $IN_FILE_FULL_NM 에 $IN_FUNC_NM 이 존재하여야 합니다."
        err_msg "(조치) 소스 파일을 확인해 보시기 바랍니다."
        exit 8
    else
        pt_msg "(정상항목) dlcall symbol 명이 ($c)건 정상적으로 존재합니다"
    fi
 
}
 
# **************************************************************************************************
####################################################################################################
 
if [ $# -eq 0 ]; then
    runfilename=${0##*/}
    echo " "
    echo " USAGE: $runfilename LIBRARY_FULL_PATH"
    echo " "
    exit -1
fi
 
# set env
if [ "$TDLDIR" = "" ]; then
    err_msg "환경변수 TDLDIR 이 정의되어 있지 않습니다. "
    exit -10
fi
 
TDL_RUN_DIR="${TDLDIR}/run"
TDL_LNK_DIR="${TDLDIR}/mod"
 
 
# **************************************************************************************************
 
# set argument
for args
do
    check_dlupdate_library $args
 
    pt_msg " o dlupdate 검증 종료 "
done
 
exit 0
 
 
cs

[프로프레임 3.0 @ AIX 7.1] 에 맞춰져 있다. 다른 OS 라면 약간의 수정이 필요할 것이다.

반응형