eval работает в скрипте, пока не будет установлен как сервис - PullRequest
0 голосов
/ 05 июля 2018

В Red Hat 7.4 в init.d у меня есть файл sapabi, который устанавливается с помощью вызова

  • chkconfig - add sapabi

Это приводит к таким записям, как /etc/rc3.d/

  • S10network
  • S90sapinit
  • S91sapabi

Пример записи в /etc/rc6.d/

  • K90network
  • K09sapabi
  • K10sapinit

Когда я запускаю файл как пользователь root с помощью команды

  • . / Sapabi start
  • сервисный запуск sapabi
  • сервисная остановка сапаби

все работает нормально, и удаленный агент диагностики SAP запускается или останавливается с помощью sapcontrol, как и предполагалось.

Однако, когда я ввожу команду 'reboot':

  • во время выключения ничего не выполняется вообще, даже аргумент 'stop'
  • во время запуска, start передается в качестве аргумента и вызывается функция start (). К сожалению, команда 'eval' sapcontrol не выполняется так, как при вызове команды запуска ./sapabi. Вместо этого файл журнала возвращает «справку» 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;

Ответы [ 2 ]

0 голосов
/ 01 августа 2018

Проблема связана с паролем, содержащим знак «#». Чтобы избежать этого, нужно поставить знак «\» перед знаком «#».

0 голосов
/ 05 июля 2018

Если я правильно прочитал ваш код, вы используете eval для создания записи в журнале. В этом случае замените eval witch echo «...» и удалите все, кроме кавычек открытия и закрытия.

...