QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1134|回复: 8

MagicLinux-2.0中的服务脚本,不能自动停止,原因不明。请教,谢谢。

[复制链接]
发表于 2008-1-14 12:01:52 | 显示全部楼层 |阅读模式
我试着自己编写了一个服务控制脚本,手工操作时该脚本能正确响应“start”参数和“stop”参数。

我用“chkconfig”将该脚本配置进启动项,并只在Lv3、Lv5时“on”,在其他级别“off”。在切换到Lv3、Lv5的过程中能发现将本被执行,而且是“start”方式;在切换向其他级别的过程中脚本不运行。原因不明。

以下为测试脚本的最简化版本:
/etc/rc.d/init.d/tfw_test

#!/bin/sh
#   chkconfig: 1234560 55 10
#   description: -_-|||

# Source function library.
if [ -f /etc/init.d/functions ] ; then
        . /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
        . /etc/rc.d/init.d/functions
else
        exit 0
fi

prog=TEST

start () {
        echo "start ()"
        return 0;
}

stop () {
        echo "stop ()"
        return 0;
}

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

exit 0

脚本哪里有问题?

[ 本帖最后由 自由狼-台风 于 2008-1-14 16:15 编辑 ]
发表于 2008-1-14 12:16:25 | 显示全部楼层
至少我没有遇到类似问题,检查你的启动项配置。
回复

使用道具 举报

 楼主| 发表于 2008-1-14 12:28:08 | 显示全部楼层
smb和cups都能在切换运行级别时自动启

[root@TFW-ML201-DT init.d]# chkconfig --list tfw_test
tfw_test        0:关闭  1:关闭  2:关闭  3:启用  4:关闭  5:启用  6:关闭
[root@TFW-ML201-DT init.d]# chkconfig --list smb
smb             0:关闭  1:关闭  2:关闭  3:启用  4:关闭  5:启用  6:关闭
[root@TFW-ML201-DT init.d]# chkconfig --list cups
cups            0:关闭  1:关闭  2:关闭  3:启用  4:关闭  5:启用  6:关闭
[root@TFW-ML201-DT init.d]#

欲仿制smb脚本和cups脚本,却始终未得要领,无法领会其奥义,在网上(包括E文)也没找到有效的指导……

[ 本帖最后由 自由狼-台风 于 2008-1-14 12:45 编辑 ]
回复

使用道具 举报

发表于 2008-1-14 13:38:33 | 显示全部楼层
脚本应该不难懂吧。
回复

使用道具 举报

 楼主| 发表于 2008-1-14 13:56:49 | 显示全部楼层
俺搞Java的,临时客串服务器管理,带结构控制的Shell脚本最近两天才接触……
回复

使用道具 举报

 楼主| 发表于 2008-1-14 15:09:19 | 显示全部楼层
目前的摸索结果表名,在切换到该服务“off”的运行级别时,脚本不会执行,“stop”段仅仅是为手动操作准备的,而操作系统有另外一套机制来停止服务。

原始短消息: 关于你的脚本 ~~
原始短消息: 关于你的脚本 ~~

              我感觉 ,在 3 ,5 下面, 脚本 的 START  ,STOP   , 应该可以执行的, 不然,你 应该在 12345 下都 设为 ON
    这样当在级别切换时 rc*.d 下面的 S,K 两个文件 才会执行吧
    目前只是 通过你的 信件 或是帖子来 推断你在可能作什么 ,但还是不太确定,能给我点详细 的资料吗,你要做的东西,也许,除了 用 rc*.d, 还可能会有别的什么 方法。     把要实现的目的 再详细 一点。


========================================

当前状况:

我的计算机上装有PostgreSQL,是自己下载编译安装的。

========================================

预期目标:

在运行级别为3和5时PostgreSQL运行,而在其他级别不运行。

========================================

已经做过的尝试:

--------------------

修改模板脚本$PG_BUILD_DIR/contrib/start-scripts/linux,用实际安装路径、实际数据库路径、实际日志文件路径和实际DBA帐号替换预设值,并将此脚本复制为/etc/rc.d/init.d/tfw_pgsq。

模板脚本/home/typhoon/123/tmp/pg8/postgresql-8.1.4/contrib/start-scripts/linux:
  1. Start
复制代码

#! /bin/sh

# chkconfig: 35 98 02
# description: PostgreSQL RDBMS

# This is an example of a start/stop script for SysV-style init, such
# as is used on Linux systems.  You should edit some of the variables
# and maybe the 'echo' commands.
#
# Place this file at /etc/init.d/postgresql (or
# /etc/rc.d/init.d/postgresql) and make symlinks to
#   /etc/rc.d/rc0.d/K02postgresql
#   /etc/rc.d/rc1.d/K02postgresql
#   /etc/rc.d/rc2.d/K02postgresql
#   /etc/rc.d/rc3.d/S98postgresql
#   /etc/rc.d/rc4.d/S98postgresql
#   /etc/rc.d/rc5.d/S98postgresql
# Or, if you have chkconfig, simply:
# chkconfig --add postgresql
#
# Proper init scripts on Linux systems normally require setting lock
# and pid files under /var/run as well as reacting to network
# settings, so you should treat this with care.

# Original author:  Ryan Kirkpatrick <[email protected]>

# $PostgreSQL: pgsql/contrib/start-scripts/linux,v 1.7 2004/10/01 18:30:21 tgl Exp $

## EDIT FROM HERE

# Installation prefix
prefix=/opt/prog/m/PostgreSQL.MagicLinux-2.0

# Data directory
PGDATA="/opt/database/PostgreSQL-Database"

# Who to run the postmaster as, usually "postgres".  (NOT "root")
PGUSER=dba

# Where to keep a log file
PGLOG="$PGDATA/server.log"

## STOP EDITING HERE

# Check for echo -n vs echo \c
if echo '\c' | grep -s c >/dev/null 2>&1 ; then
    ECHO_N="echo -n"
    ECHO_C=""
else
    ECHO_N="echo"
    ECHO_C='\c'
fi

# The path that is to be used for the script
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:$prefix/bin

# What to use to start up the postmaster (we do NOT use pg_ctl for this,
# as it adds no value and can cause the postmaster to misrecognize a stale
# lock file)
DAEMON="$prefix/bin/postmaster"

# What to use to shut down the postmaster
PGCTL="$prefix/bin/pg_ctl"

set -e

# Only start if we can find the postmaster.
test -x $DAEMON || exit 0

# Parse command line parameters.
case $1 in
  start)
        $ECHO_N "Starting PostgreSQL: "$ECHO_C
        su - $PGUSER -c "$DAEMON -D '$PGDATA' &" >>$PGLOG 2>&1
        echo "ok"
        ;;
  stop)
        echo -n "Stopping PostgreSQL: "
        su - $PGUSER -c "$PGCTL stop -D '$PGDATA' -s -m fast"
        echo "ok"
        ;;
  restart)
        echo -n "Restarting PostgreSQL: "
        su - $PGUSER -c "$PGCTL stop -D '$PGDATA' -s -m fast -w"
        su - $PGUSER -c "$DAEMON -D '$PGDATA' &" >>$PGLOG 2>&1
        echo "ok"
        ;;
  reload)
        echo -n "Reload PostgreSQL: "
        su - $PGUSER -c "$PGCTL reload -D '$PGDATA' -s"
        echo "ok"
        ;;
  status)
        su - $PGUSER -c "$PGCTL status -D '$PGDATA'"
        ;;
  *)
        # Print help
        echo "Usage: $0 {start|stop|restart|reload|status}" 1>&2
        exit 1
        ;;
esac

exit 0
  1. Ended
复制代码

配置:
[root@xz_server init.d]# chkconfig --list tfw_pgsql
tfw_pgsql       0:关闭  1:关闭  2:关闭  3:启用  4:关闭  5:启用  6:关闭
[root@xz_server init.d]#
结果:
切换向运行级别3时,tfw_pgsql的start被运行,PostgreSQL启动;
切换出运行级别3时,tfw_pgsql的stop[color]没被运行(应该echo的东西没显示),且PostgreSQL仍在运行(由ps得知);
手工运行tfw_pgsql能正常控制PostgreSQL启停。

[ 本帖最后由 自由狼-台风 于 2008-1-14 16:59 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2008-1-14 16:57:49 | 显示全部楼层
--------------------

以/etc/rc.d/init.d/smb作为模板,复制为/etc/rc.d/init.d/tfw_smb。用“chkconfig”取消smb服务,添加tfw_smb服务,再切换运行级别,SMB和NMB无法启动。脚本内容:
  1. Start
复制代码

#!/bin/sh
#
# chkconfig: 35 91 35
# description: Starts and stops the Samba smbd and nmbd daemons \
#               used to provide SMB network services.
#
# pidfile: /var/run/samba/smbd.pid
# pidfile: /var/run/samba/nmbd.pid
# config:  /etc/samba/smb.conf


# Source function library.
if [ -f /etc/init.d/functions ] ; then
  . /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
  . /etc/rc.d/init.d/functions
else
  exit 0
fi

# Avoid using root's TMPDIR
unset TMPDIR

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

if [ -f /etc/sysconfig/samba ]; then
   . /etc/sysconfig/samba
fi

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

# Check that smb.conf exists.
[ -f /etc/samba/smb.conf ] || exit 0

RETVAL=0


start() {
        KIND="SMB"
        echo -n $"Starting $KIND services: "
        daemon smbd $SMBDOPTIONS
        RETVAL=$?
        echo
        KIND="NMB"
        echo -n $"Starting $KIND services: "
        daemon nmbd $NMBDOPTIONS
        RETVAL2=$?
        echo
        [ $RETVAL -eq 0 -a $RETVAL2 -eq 0 ] && touch /var/lock/subsys/smb || \
           RETVAL=1
        return $RETVAL
}        

stop() {
        KIND="SMB"
        echo -n $"Shutting down $KIND services: "
        killproc smbd
        RETVAL=$?
        echo
        KIND="NMB"
        echo -n $"Shutting down $KIND services: "
        killproc nmbd
        RETVAL2=$?
        [ $RETVAL -eq 0 -a $RETVAL2 -eq 0 ] && rm -f /var/lock/subsys/smb
        echo ""
        return $RETVAL
}        

restart() {
        stop
        start
}        

reload() {
        echo -n $"Reloading smb.conf file: "
        killproc smbd -HUP
        RETVAL=$?
        echo
        return $RETVAL
}        

rhstatus() {
        status smbd
        status nmbd
}        


# Allow status as non-root.
if [ "$1" = status ]; then
       rhstatus
       exit $?
fi

# Check that we can write to it... so non-root users stop here
[ -w /etc/samba/smb.conf ] || exit 0



case "$1" in
  start)
          start
        ;;
  stop)
          stop
        ;;
  restart)
          restart
        ;;
  reload)
          reload
        ;;
  status)
          rhstatus
        ;;
  condrestart)
          [ -f /var/lock/subsys/smb ] && restart || :
        ;;
  *)
        echo $"Usage: $0 {start|stop|restart|reload|status|condrestart}"
        exit 1
esac

exit $?
  1. Ended
复制代码


--------------------

以/etc/rc.d/init.d/cups作为模板,复制为/etc/rc.d/init.d/tfw_pgsql。删除start和stop以外的条目,用PostgreSQL起停命令替换CUPS启停命令,用“chkconfig”添加tfw_pgsq服务,再切换运行级别,PostgreSQL只是启动,不停止。但手工执行tfw_pgsql能正常启停PostgreSQL。

--------------------

又写了一个如下脚本,同样配置运行级别,切换运行级别,只有start项运行(能看到“start()”),stop项未运行(没看到“stop()”):
  1. Start
复制代码

#!/bin/sh
#   chkconfig: 1234560 55 10
#   description: -_-|||
# Source function library
.
if [ -f /etc/init.d/functions ] ; then
        . /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
        . /etc/rc.d/init.d/functions
else
        exit 0
fi

prog=
TEST

start () {
        echo "start ()"
        return 0;
}
stop ()
{
        echo "stop ()"
        return 0;
}

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

exit 0
  1. Ended
复制代码

[ 本帖最后由 自由狼-台风 于 2008-1-14 17:05 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2008-1-14 17:09:11 | 显示全部楼层
--------------------

受人启发,弄出一个很邪恶很猥琐的解决办法,脚本在所有运行级别都设置为“on”,在切换到某个运行级别时脚本捕获系统运行级别,并根据当前运行级别决定到底是开启服务还是关闭服务:
  1. Start
复制代码

#!/bin/sh
#   chkconfig: 1234560 55 10

#   description: -_-|||

# Source function library
.
if [ -f /etc/init.d/functions ] ; then
        . /etc/init.d/functions
elif
[ -f /etc/rc.d/init.d/functions ] ; then
        . /etc/rc.d/init.d/functions
else

        exit 0
fi


prog=
T.F.W.

action ()
{
        curlv=$(runlevel | awk '{print $2}')
        echo -n "        Current run level: $curlv "
        if [ $curlv -eq 5 ]
        then
                echo "A"
                start_
        elif [ $curlv -eq 3 ]
        then
                echo "B"
                start_
        else
                echo "C"
                stop
        fi
}

start () {
        action
}

start_ ()
{
        echo "start_ ()"
        return 0;
}


stop ()
{
        echo "stop ()"
        return 0;
}

case
$1 in
        'start')
                echo "1"
                action
        ;;
        'start_')
                echo "2"
                start_
        ;;
        'stop')
                echo "3"
                stop
        ;;
        *)
        echo $"Usage: $prog {start|stop}"
        exit 1esac
exit
$RETVAL
  1. Ended
复制代码

[ 本帖最后由 自由狼-台风 于 2008-1-14 17:14 编辑 ]
回复

使用道具 举报

发表于 2008-1-14 20:27:15 | 显示全部楼层
看看 启动脚本 rc是怎么编的,也许就 明白了 。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-23 22:56 , Processed in 0.089330 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表