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 编辑 ] 至少我没有遇到类似问题,检查你的启动项配置。 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 编辑 ] 脚本应该不难懂吧。 俺搞Java的,临时客串服务器管理,带结构控制的Shell脚本最近两天才接触…… 目前的摸索结果表名,在切换到该服务“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 编辑 ] --------------------
以/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 编辑 ] --------------------
受人启发,弄出一个很邪恶很猥琐的解决办法,脚本在所有运行级别都设置为“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 编辑 ] 看看 启动脚本 rc是怎么编的,也许就 明白了 。
页:
[1]