免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2538 | 回复: 1
打印 上一主题 下一主题

safe_asterisk脚本 求助!老大们帮帮忙! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-01-04 20:44 |只看该作者 |倒序浏览
#!/bin/sh
# vim:textwidth=80:tabstop=4:shiftwidth=4:smartindent:autoindent

CLIARGS="$*"                # Grab any args passed to safe_asterisk
TTY=9                       # TTY (if you want one) for Asterisk to run on
CONSOLE=yes                 # Whether or not you want a console
#NOTIFY=ben@alkaloid.net    # Who to notify about crashes
MACHINE=`hostname`          # To specify which machine has crashed when getting the mail
DUMPDROP=/tmp
SLEEPSECS=4
ASTSBINDIR=/usr/sbin

# comment this line out to have this script _not_ kill all mpg123 processes when
# asterisk exits
KILLALLMPG123=1

# run asterisk with this priority
PRIORITY=0

# set system filemax on supported OSes if this variable is set
# SYSMAXFILES=262144

# set max files open with ulimit. On linux systems, this will be automatically
# set to the system's maximum files open devided by two, if not set here.
# MAXFILES=32768

# since we're going to change priority and open files limits, we need to be
# root. if running asterisk as other users, pass that to asterisk on the command
# line.
# if we're not root, fall back to standard everything.
if [ `id -u` != 0 ]
then
    echo "Ops. I'm not root. Falling back to standard prio and file max." >&2
    echo "This is NOT suitable for large systems." >&2
    PRIORITY=0
else
    if `echo $OSTYPE | grep linux 2>&1 > /dev/null `
    then
        # maximum number of open files is set to the system maximum divided by two if
        # MAXFILES is not set.
        if [ "$MAXFILES" = "" ]
        then
            # just check if file-max is readable
            if [ -r /proc/sys/fs/file-max ]
            then
                MAXFILES=$(( `cat /proc/sys/fs/file-max` / 2 ))
            fi
        fi
        SYSCTL_MAXFILES="fs.file-max"
    elif `echo $OSTYPE | grep darwin 2>&1 > /dev/null `
    then
        SYSCTL_MAXFILES="kern.maxfiles"
    fi


    if [ "$SYSMAXFILES" != "" ]
    then
        if [ "$SYSCTL_MAXFILES" != "" ]
        then
            sysctl -w $SYSCTL_MAXFILES=$SYSMAXFILES
        fi
    fi

    # set the process's filemax to whatever set above
    ulimit -n $MAXFILES

fi

#
# Let Asterisk dump core
#
ulimit -c unlimited

#
# Don't fork when running "safely"
#
ASTARGS=""
if [ "$TTY" != "" ]; then
    if [ -c /dev/tty${TTY} ]; then
        TTY=tty${TTY}
    elif [ -c /dev/vc/${TTY} ]; then
        TTY=vc/${TTY}
    else
        echo "Cannot find your TTY (${TTY})" >&2
        exit 1
    fi
    ASTARGS="${ASTARGS} -vvvg"
    if [ "$CONSOLE" != "no" ]; then
        ASTARGS="${ASTARGS} -c"
    fi
fi
if [ ! -w ${DUMPDROP} ]; then
    echo "Cannot write to ${DUMPDROP}" >&2
    exit 1
fi

#
# Run scripts to set any environment variables or do any other system-specific setup needed
#

if [ -d /etc/asterisk/startup.d ]; then
    for script in /etc/asterisk/startup.d/*.sh; do
        if [ -x ${script} ]; then
            source ${script}
        fi
    done
fi

run_asterisk()
{
    while :; do

        if [ "$TTY" != "" ]; then
            cd /tmp
            stty sane < /dev/${TTY}
            nice -n $PRIORITY ${ASTSBINDIR}/asterisk ${CLIARGS} ${ASTARGS} >& /dev/${TTY} < /dev/${TTY}
        else
            cd /tmp
            nice -n $PRIORITY ${ASTSBINDIR}/asterisk ${CLIARGS} ${ASTARGS}
        fi
        EXITSTATUS=$?
        echo "Asterisk ended with exit status $EXITSTATUS"
        if [ "$EXITSTATUS" = "0" ]; then
            # Properly shutdown....
            echo "Asterisk shutdown normally."
            exit 0
        elif [ $EXITSTATUS -gt 128 ]; then
            let EXITSIGNAL=EXITSTATUS-128
            echo "Asterisk exited on signal $EXITSIGNAL."
            if [ "$NOTIFY" != "" ]; then
                echo "Asterisk on $MACHINE exited on signal $EXITSIGNAL.  Might want to take a peek." | \
                mail -s "Asterisk Died" $NOTIFY
            fi
            if [ -f /tmp/core ]; then
                mv /tmp/core ${DUMPDROP}/core.`hostname`-`date -Iseconds` &
            fi
        else
            if [ "${EXITSTATUS}" = "0" ]; then
                echo "Asterisk ended normally.  Aborting."
                exit 0
            else
                echo "Asterisk died with code $EXITSTATUS."
                if [ -f /tmp/core ]; then
                    mv /tmp/core ${DUMPDROP}/core.`hostname`-`date -Iseconds` &
                fi
            fi
        fi
        echo "Automatically restarting Asterisk."
        sleep $SLEEPSECS
        if [ $KILLALLMPG123 ]
        then
            killall -9 mpg123
        fi
    done
}

run_asterisk &
本脚本已经实现功能1、故障后自恢复(已完成) 2、记录每次故障后的状态:时间,PID,返回码,dumpcore文件名导出到一个文本文件中 3、邮件发送当前记录,求助高手们怎么写2和3的供呢个

论坛徽章:
0
2 [报告]
发表于 2007-01-05 13:09 |只看该作者
老大们有给意见的没 ?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP