Скрипт rc.d по умолчанию имеет аргумент "start"? - PullRequest
0 голосов
/ 15 октября 2018

Моя цель - создать службу сценариев bash, которая создает файл, когда уровень запуска равен 5, и удалять этот файл, когда уровень запуска равен 3.

Проблема, с которой я столкнулся, - это когда я достиг уровня запуска 3.Я получаю:

Текущий уровень: 3 и количество аргументов: 1 Я нахожусь в строке 10.Команда start

Почему она получает аргумент start, а я не передавал аргумент.
Функция start предназначена для создания файла, а функция stop - для удаления файла, и они работают нормально.
Я могу заставить скрипт работать нормально, если уберу условие проверки количества аргументов и позволю скрипту просто удалитьфайл, когда он находится на уровне 3

, но то, что он говорит мне, что число аргументов равно 1 и начинается, не приходит мне в голову.Я уже провел много исследований, и я не нашел никакого решения.

#! /bin/bash
# chkconfig: 35 99 01
# description : some startup script

#### Constants
FILE="/home/ayadi/Desktop/inittp"
CURRENT_LVL="$(runlevel | awk '{print $2}')"
echo "The current lvl is : $CURRENT_LVL and number of arguments is : $# "
echo "I am at line 10 . The command is $1"

#### Functions
start(){
    if ! [[ -f "$FILE" ]];
    then
    touch "$FILE"
    echo "File Created..."
    else
    echo "File Does Exist..."
    fi
}
stop(){
    if [[ -f "$FILE" ]];
    then
    rm "$FILE"
    echo "File Deleted..."
    else
    echo "File Does Not Exist..."
    fi
}

#### Main

if [ $# -eq 0 ]
then
    echo "Entred the arguments -eq 0"
    if [ "$CURRENT_LVL" == "5" ]
    then
        echo "Entred the if current lvl 5 statement"
        start
    fi
    if [ "$CURRENT_LVL" == "3" ]
    then
        echo "Entred the if current lvl 3 statement"
        stop
    fi

else

case "$1" in
    [sS][tT][aA][rR][tT])
        if  ! ([ -e "$FILE" ])
        then
        echo "I am the case statement.the command is $1"
        start
        fi
        ;;
    [sS][tT][oO][pP])
        if [ -e "$FILE" ]
        then
        stop
        fi
        ;;
    *)
        echo "Please enter start or stop"
        ;;
esac

fi

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

По умолчанию, когда служба вызывается для автоматического запуска на определенном уровне запуска, ей присваивается аргумент «start».

0 голосов
/ 15 октября 2018

Советы по отладке, измените это:

echo "The current lvl is : $CURRENT_LVL and number of arguments is : $# "
echo "I am at line 10 . The command is $1"

На это:

echo "The current lvl is : $CURRENT_LVL and number of arguments is : $# "
echo "I am at line 10 . The command is \"$1\", the whole command line is \"$0 $@\""

Это не решит проблему, но обеспечитбольше информации о том, что на самом деле происходит.


#Main можно упростить.Это ничего не решит, но об этом будет легче думать:

#### Main

case "${1,,}" in
    "")     echo "Entered no arguments."
            case "$CURRENT_LVL" in
              3|5) echo "Entered the if current level ${CURRENT_LVL} statement" ;;&
              5)   start ;;
              3)   stop ;;
            esac  ;;

    start)  if ! [ -e "$FILE" ] ; then
                echo "I am the case statement.the command is $1"
                start
            fi ;;

    stop)   [ -e "$FILE" ] && stop ;;

    *)      echo "Please enter start or stop" ;;
esac

Обратите внимание на bash isms .${1,,} возвращает $1 в нижнем регистре.;;& падает до следующего case теста, а не прыгает до ecase.

...