CentOS - TCL 스크립트는 셸에서 작동하지만 init.d에서는 실패합니다.

CentOS - TCL 스크립트는 셸에서 작동하지만 init.d에서는 실패합니다.

CentOS 6.5에는 아무 문제 없이 셸에서 루트로 실행하는 TCL 스크립트가 있습니다. 하지만 init.d에서 서비스로 실행하면 실패합니다. init.d 스크립트는 다음과 같습니다.

#!/bin/bash
#
# camelot    Camelot 11.5.0
#

# Source function library.
. /etc/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
CAMELOT_LOGS=/var/camelot/logs
CAMELOT_LIB=/usr/local/camelot/lib
RETVAL=0
prog="camelot"
LOCKFILE=/var/lock/subsys/$prog

# Declare variables for service

start() {
    echo -n "Starting $prog: "
    /opt/camelot/register-phones.sh
    RETVAL=$?
    [ $RETVAL -eq 0 ] && touch $LOCKFILE
    echo
    return $RETVAL
}

stop() {
    echo -n "Shutting down $prog: "
    killall screen
    RETVAL=$?
    [ $RETVAL -eq 0 ] && rm -f $LOCKFILE
    echo
    return $RETVAL
}

status() {
    echo -n "Checking $prog status: "
    echo -n "Sorry, not implemented yet. run 'screen -r' to check on the process."
    RETVAL=$?
    return $RETVAL
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        status
        ;;
    restart)
        stop
       ;;
    *)
        echo "Usage: $prog {start|stop|status|restart}"
esac
exit $RETVAL

내가 받은 오류 메시지는 다음과 같습니다.

Starting camelot: camelot server at localhost:6060 is inaccessible
    while executing
"error "camelot server at $server:$port is inaccessible""
    (procedure "dorpc" line 122)
    invoked from within
"dorpc $server $port $outmsg"
    (procedure "createendpoint" line 7)
    invoked from within
"createendpoint $server $port 0 "$type $args@""
    (procedure "camelot::newendpoint" line 10)
    invoked from within
"camelot::newendpoint $CamelotServerIp $CamelotServerPort sipx SEP$ep2MAC"
    (procedure "registerPhone" line 22)
    invoked from within
"registerPhone $data"
    ("while" body line 3)
    invoked from within
"while {$data != ""} {
     # puts $data
     puts [registerPhone $data]
     gets $fp data
 }"
    (file "/opt/camelot/register-phones.sh" line 7)

TCL이 dorpc를 실행할 수 없는 것 같지만 포트는 확실히 열려 있습니다. 여기에서 실패한 직후 셸에서 스크립트를 실행할 수 있으며 제대로 작동합니다. 나는 printenv에서 볼 수 있는 모든 관련 환경 변수를 루트로 설정했다고 생각합니다(init.d 스크립트에서 환경 변수를 설정했는지 여부에 관계없이 동일한 오류가 발생합니다).

init.d와 TCL에 대해 제가 놓친 것이 있나요?

답변1

내 친구가 이 문제를 해결하는 데 도움을 주었습니다. 우리는 bash -l -c를 사용하여 TCL 스크립트를 실행하기 위한 전체 로그인 셸을 얻었습니다. 분명히 다음을 선호했습니다.

start() {
    echo -n "Starting $prog: "
    /bin/bash -l -c '/opt/camelot/register-phones.sh'
    RETVAL=$?
    [ $RETVAL -eq 0 ] && touch $LOCKFILE
    echo
    return $RETVAL
}

관련 정보