自由狼-台风 发表于 2008-1-14 12:01:52

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

我试着自己编写了一个服务控制脚本,手工操作时该脚本能正确响应“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 编辑 ]

Jagen 发表于 2008-1-14 12:16:25

至少我没有遇到类似问题,检查你的启动项配置。

自由狼-台风 发表于 2008-1-14 12:28:08

smb和cups都能在切换运行级别时自动启停。

# chkconfig --list tfw_test
tfw_test      0:关闭1:关闭2:关闭3:启用4:关闭5:启用6:关闭
# chkconfig --list smb
smb             0:关闭1:关闭2:关闭3:启用4:关闭5:启用6:关闭
# chkconfig --list cups
cups            0:关闭1:关闭2:关闭3:启用4:关闭5:启用6:关闭
#

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

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

Jagen 发表于 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:
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
Ended
配置:
# chkconfig --list tfw_pgsql
tfw_pgsql       0:关闭1:关闭2:关闭3:启用4:关闭5:启用6:关闭
#
结果:
切换向运行级别3时,tfw_pgsql的start被运行,PostgreSQL启动;
切换出运行级别3时,tfw_pgsql的stop没被运行(应该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无法启动。脚本内容:
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 $?
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()”):
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
Ended

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

自由狼-台风 发表于 2008-1-14 17:09:11

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

受人启发,弄出一个很邪恶很猥琐的解决办法,脚本在所有运行级别都设置为“on”,在切换到某个运行级别时脚本捕获系统运行级别,并根据当前运行级别决定到底是开启服务还是关闭服务:
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
Ended

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

lanzinc 发表于 2008-1-14 20:27:15

看看 启动脚本 rc是怎么编的,也许就 明白了 。
页: [1]
查看完整版本: MagicLinux-2.0中的服务脚本,不能自动停止,原因不明。请教,谢谢。