在 Red Hat 7.4 的 init.d 中,我有文件 sapabi,它是通过调用安装的
- chkconfig --add sapabi
这导致像 /etc/rc3.d/ 这样的条目
- S10网络
- S90sapinit
- S91萨帕比
/etc/rc6.d/ 中的示例条目
- K90网络
- K09萨帕比
- K10sapinit
当我使用命令以用户 root 身份执行文件时
- ./sapabi 开始
- 服务 sapabi 开始
- 服务 sapabi 停止
一切正常,远程 SAP 诊断代理按预期由 sapcontrol 启动或停止。
但是,当我输入“重启”命令时:
- 在关机期间根本不执行任何操作,甚至不执行“停止”参数
- 在启动期间, start 作为参数传递并调用 start() 函数。不幸的是,'eval' sapcontrol 命令没有像我调用 ./sapabi start 命令时那样执行。相反,日志文件返回 sapcontrol 的“帮助”:
名称 sapcontrol(版本:753,补丁 200,更改列表 1844229)
概要 sapcontrol [-prot] [-trace] [-debug] ...
- 为什么 eval 在启动过程中没有像直接启动脚本一样正确执行?
- 为什么关闭期间服务没有停止?
- 我在Required-Start 或Required-Stop 中遗漏了什么吗?
- 我不太确定在 eval 语句中正确使用 ' 或 "
非常感谢您的帮助
#!/bin/sh
#
# /etc/init.d/sapabi
#
# chkconfig: 345 91 09
# description: Start / stop SAP
#
### BEGIN INIT INFO
# Provides: sapabi
# Required-Start: $network $syslog $local_fs $named $remote_fs $time
# X-UnitedLinux-Should-Start:
# Required-Stop: $network $syslog $local_fs $named $remote_fs $time
# Default-Start: 3 5
# Default-Stop: 0 1 2 6
# Short-Description: Start the sap system
# Description: Start the sap system
### END INIT INFO
PGM_PATH=$0
ARG1=$1
ARG2=$2
# Remote Diagnostics Agent configuration
#
# DA_R : If set to 1, remote diagnostics services will be started.
#
DA_R=1
DA_R_OS_USER="daaadm"
DA_R_OS_USER_PASSWORD="xxxxxx"
DA_R_INSTANCE_NR="98"
DA_R_START_CMD="StartSystem"
DA_R_STOP_CMD="StopSystem"
DA_R_HOST="xxx.xxx.xxx"
log=/var/log/sapabi.log
function ping_server()
{
target=$1
ping -c1 -w3 ${target} &>/dev/null && return 1 || return 0
}
function start_service()
{
serviceName=$1
localSidAdm=$2
serviceHost=$3
serviceUser=$4
servicePassword=$5
serviceInstance=$6
serviceStartCmd=$7
processName=$8
waitTime=$9
ping_server $serviceHost;
if [ $? -eq 1 ];
then
echo "in ping start_service $serviceName" >> $log
eval ' su -s /bin/csh -l "$localSidAdm" -c "sapcontrol -nr "$serviceInstance" -host "$serviceHost" -user "$serviceUser" "$servicePassword" -function "$serviceStartCmd""' >> $log
test=""
startTime=$(date +%s)
currentTime=$(date +%s)
while [[ "${test}" != *"GREEN"* && ($((currentTime - startTime)) -lt $waitTime) ]];
do
test=`su -s /bin/csh -l "$localSidAdm" -c 'sapcontrol -nr '"$serviceInstance"' -host '"$serviceHost"' -user '"$serviceUser"' '"$servicePassword"' -function GetProcessList | grep '"$processName"''`
# Do not print the trailing newline character
echo -n "."
sleep 1
currentTime=$(date +%s)
done
echo ""
echo "$serviceName - time $((currentTime - startTime)) seconds - ${test}" >> $log
else
echo "Error : ${serviceName} host ${serviceHost} not available"
do_exit ${ERR_unknown_host}
fi
unset serviceName
unset localSidAdm
unset serviceHost
unset serviceUser
unset servicePassword
unset serviceInstance
unset serviceStartCmd
unset processName
unset waitTime
}
start() {
#start the remote Diagnostics Agent
if [ "$DA_R" == 1 ];
then
echo "Starting the remote Diagnostics Agent"
start_service "Remote Diagnostics Agent" $LOCAL_SIDADM $DA_R_HOST $DA_R_OS_USER $DA_R_OS_USER_PASSWORD $DA_R_INSTANCE_NR $DA_R_START_CMD "jstart" "2700"
fi
}
... similar stop functions ...
case "${ARG1}" in
start )
start
;;
stop )
stop
;;
status )
status
;;
restart )
stop
start
;;
* )
echo "Usage: ${PGM_PATH} {start|stop|status|restart}"
do_exit
;;
esac;