Скрипт в /etc/init.d/ не работает.

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС для молодых и начинающих системных администраторов.

Модераторы: SLEDopit, Модераторы разделов

Аватара пользователя
Yaros
Сообщения: 501
ОС: Debian Wheezy / Gentoo

Скрипт в /etc/init.d/ не работает.

Сообщение Yaros »

При запуске скрипт выдает следующее:

Код:

defaultuser@coreDebian:/etc$ sudo /etc/init.d/tcpdump restart Restarting TCPdump: tcpdumptcpdump: syntax error failed! defaultuser@coreDebian:/etc$

Написано на основе skeleton. Менял вроде только параметры. Скрипт:

Код:

#! /bin/sh ### BEGIN INIT INFO # Provides: tcpdump # Required-Start: $remote_fs # Required-Stop: $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: script for tcpdump-as-daemon-work # Description: This script provide daemon-style working to tcpdump ### END INIT INFO # Author: Yaroslav Shevchenko <lazy._SPAMCHECKERWORD_starwing@gmail.com> # Do NOT "set -e" # PATH should only include /usr/* if it runs after the mountnfs.sh script PATH=/sbin:/usr/sbin:/bin:/usr/bin DESC="TCPdump" NAME=tcpdump DAEMON=/usr/sbin/$NAME DAEMON_ARGS="-s 1500 -n -nn -vvv -w /var/log/tcpd &" PIDFILE=/var/run/$NAME.pid SCRIPTNAME=/etc/init.d/$NAME # Exit if the package is not installed [ -x "$DAEMON" ] || exit 0 # Read configuration variable file if it is present [ -r /etc/default/$NAME ] && . /etc/default/$NAME # Load the VERBOSE setting and other rcS variables . /lib/init/vars.sh # Define LSB log_* functions. # Depend on lsb-base (>= 3.0-6) to ensure that this file is present. . /lib/lsb/init-functions # # Function that starts the daemon/service # do_start() { # Return # 0 if daemon has been started # 1 if daemon was already running # 2 if daemon could not be started start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \ || return 1 start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \ $DAEMON_ARGS \ || return 2 # Add code here, if necessary, that waits for the process to be ready # to handle requests from services started subsequently which depend # on this one. As a last resort, sleep for some time. } # # Function that stops the daemon/service # do_stop() { # Return # 0 if daemon has been stopped # 1 if daemon was already stopped # 2 if daemon could not be stopped # other if a failure occurred start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME RETVAL="$?" [ "$RETVAL" = 2 ] && return 2 # Wait for children to finish too if this is a daemon that forks # and if the daemon is only ever run from this initscript. # If the above conditions are not satisfied then add some other code # that waits for the process to drop all resources that could be # needed by services started subsequently. A last resort is to # sleep for some time. start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON [ "$?" = 2 ] && return 2 # Many daemons don't delete their pidfiles when they exit. rm -f $PIDFILE return "$RETVAL" } # # Function that sends a SIGHUP to the daemon/service # do_reload() { # # If the daemon can reload its configuration without # restarting (for example, when it is sent a SIGHUP), # then implement that here. # start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME return 0 } case "$1" in start) [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" do_start case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; stop) [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" do_stop case "$?" in 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; esac ;; #reload|force-reload) # # If do_reload() is not implemented then leave this commented out # and leave 'force-reload' as an alias for 'restart'. # #log_daemon_msg "Reloading $DESC" "$NAME" #do_reload #log_end_msg $? #;; restart|force-reload) # # If the "reload" option is implemented then remove the # 'force-reload' alias # log_daemon_msg "Restarting $DESC" "$NAME" do_stop case "$?" in 0|1) do_start case "$?" in 0) log_end_msg 0 ;; 1) log_end_msg 1 ;; # Old process is still running *) log_end_msg 1 ;; # Failed to start esac ;; *) # Failed to stop log_end_msg 1 ;; esac ;; *) #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2 echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2 exit 3 ;; esac :

Буду благодарен помощи, сам что-то не догоняю, где ошибка кроется.
=========
=Мой блог. =
=========
Gentoo-ниасилятар
Спасибо сказали:
pelmen
Сообщения: 1268
ОС: debian

Re: Скрипт в /etc/init.d/ не работает.

Сообщение pelmen »

А при start, stop все нормально?
Я бы в функции restart после каждой строчки всавил "echo $NAME" и смотрел, пока не будет tcpdumptcpdump :)
Спасибо сказали:
Аватара пользователя
Ленивая Бестолочь
Бывший модератор
Сообщения: 2760
ОС: Debian; gentoo

Re: Скрипт в /etc/init.d/ не работает.

Сообщение Ленивая Бестолочь »

sh -x /etc/init.d/tcpdump restart
поглядите.
Солнце садилось в море, а люди с неоконченным высшим образованием выбегали оттуда, думая, что море закипит.
Спасибо сказали:
Аватара пользователя
Yaros
Сообщения: 501
ОС: Debian Wheezy / Gentoo

Re: Скрипт в /etc/init.d/ не работает.

Сообщение Yaros »

Ленивая Бестолочь писал(а):
10.11.2009 23:56
sh -x /etc/init.d/tcpdump restart
поглядите.

Код:

defaultuser@coreDebian:/etc$ sh -x /etc/init.d/tcpdump restart + PATH=/sbin:/usr/sbin:/bin:/usr/bin + DESC=TCPdump + NAME=tcpdump + DAEMON=/usr/sbin/tcpdump + DAEMON_ARGS='-s 1500 -n -nn -vvv -w /var/log/tcpd &' + PIDFILE=/var/run/tcpdump.pid + SCRIPTNAME=/etc/init.d/tcpdump + '[' -x /usr/sbin/tcpdump ']' + '[' -r /etc/default/tcpdump ']' + . /lib/init/vars.sh ++ '[' -f /etc/default/rcS ']' ++ . /etc/default/rcS +++ TMPTIME=0 +++ SULOGIN=no +++ DELAYLOGIN=no +++ UTC=yes +++ VERBOSE=no +++ FSCKFIX=no +++ RAMRUN=no +++ RAMLOCK=no ++ '[' -r /proc/cmdline ']' ++ grep -q ' noswap' /proc/cmdline ++ NOSWAP=no ++ '[' '!' -e /proc/cmdline ']' ++ egrep -qw quiet /proc/cmdline ++ VERBOSE=no ++ '[' '' ']' ++ true + . /lib/lsb/init-functions ++ FANCYTTY= ++ '[' -e /etc/lsb-base-logging.sh ']' ++ true + case "$1" in + log_daemon_msg 'Restarting TCPdump' tcpdump + '[' -z 'Restarting TCPdump' ']' + log_daemon_msg_pre 'Restarting TCPdump' tcpdump + : + '[' -z tcpdump ']' + echo -n 'Restarting TCPdump: tcpdump' Restarting TCPdump: tcpdump+ log_daemon_msg_post 'Restarting TCPdump' tcpdump + : + do_stop + start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile /var/run/tcpdump.pid --name tcpdump + RETVAL=1 + '[' 1 = 2 ']' + start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec /usr/sbin/tcpdump + '[' 0 = 2 ']' + rm -f /var/run/tcpdump.pid + return 1 + case "$?" in + do_start + start-stop-daemon --start --quiet --pidfile /var/run/tcpdump.pid --exec /usr/sbin/tcpdump --test + start-stop-daemon --start --quiet --pidfile /var/run/tcpdump.pid --exec /usr/sbin/tcpdump -- -s 1500 -n -nn -vvv -w /var/log/tcpd '&' tcpdump: no suitable device found + return 2 + case "$?" in + log_end_msg 1 + '[' -z 1 ']' + retval=1 + log_end_msg_pre 1 + : + log_use_fancy_output + TPUT=/usr/bin/tput + EXPR=/usr/bin/expr + '[' -t 1 ']' + '[' xxterm '!=' '' ']' + '[' xxterm '!=' xdumb ']' + '[' -x /usr/bin/tput ']' + '[' -x /usr/bin/expr ']' + /usr/bin/tput hpa 60 + /usr/bin/tput setaf 1 + '[' -z ']' + FANCYTTY=1 + case "$FANCYTTY" in + true ++ /usr/bin/tput setaf 1 + RED='' ++ /usr/bin/tput setaf 3 + YELLOW='' ++ /usr/bin/tput op + NORMAL='' + '[' 1 -eq 0 ']' + '[' 1 -eq 255 ']' + /bin/echo -e ' failed!' failed! + log_end_msg_post 1 + : + return 1 + :

Если честно, не совсем понял... Это шелл-отладчик?

pelmen писал(а):
10.11.2009 21:49
А при start, stop все нормально?
Я бы в функции restart после каждой строчки всавил "echo $NAME" и смотрел, пока не будет tcpdumptcpdump :)

Start, stop:

Код:

defaultuser@coreDebian:/etc$ sudo /etc/init.d/tcpdump stop defaultuser@coreDebian:/etc$ sudo /etc/init.d/tcpdump start tcpdump: syntax error defaultuser@coreDebian:/etc$

При

Код:

restart|force-reload) # # If the "reload" option is implemented then remove the # 'force-reload' alias # log_daemon_msg "Restarting $DESC" "$NAME" echo $NAME do_stop echo $NAME case "$?" in 0|1) echo $NAME do_start echo $NAME case "$?" in 0) log_end_msg 0 ;; 1) log_end_msg 1 ;; # Old process is still running *) log_end_msg 1 ;; # Failed to start esac ;; *) # Failed to stop log_end_msg 1 ;; esac ;; *) #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2 echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload}" >&2 exit 3 ;; esac :

выдает

Код:

defaultuser@coreDebian:/etc$ sudo /etc/init.d/tcpdump restart Restarting TCPdump: tcpdumptcpdump tcpdump tcpdump tcpdump: syntax error tcpdump .

Старт-стоп остается прежний...
=========
=Мой блог. =
=========
Gentoo-ниасилятар
Спасибо сказали:
Аватара пользователя
Encore
Сообщения: 656
Статус: loading..............
ОС: Debian

Re: Скрипт в /etc/init.d/ не работает.

Сообщение Encore »

Очевидно проблема со стартом... конкретнее - с функцией do_start()
что-то мне не нравится эта конструкция:
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
$DAEMON_ARGS
\
|| return 2

фактически при подстановке значений переменной DAEMON получается
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- -s 1500 -n -nn -vvv -w /var/log/tcpd & || return 2
Спасибо сказали:
Аватара пользователя
Yaros
Сообщения: 501
ОС: Debian Wheezy / Gentoo

Re: Скрипт в /etc/init.d/ не работает.

Сообщение Yaros »

Encore писал(а):
11.11.2009 15:11
Очевидно проблема со стартом... конкретнее - с функцией do_start()
что-то мне не нравится эта конструкция:
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
$DAEMON_ARGS
\
|| return 2

фактически при подстановке значений переменной DAEMON получается
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- -s 1500 -n -nn -vvv -w /var/log/tcpd & || return 2


Предлагаете убрать либо переменную $DAEMON_ARGS, либо "--" перед ней?
=========
=Мой блог. =
=========
Gentoo-ниасилятар
Спасибо сказали:
Аватара пользователя
Encore
Сообщения: 656
Статус: loading..............
ОС: Debian

Re: Скрипт в /etc/init.d/ не работает.

Сообщение Encore »

ну в общем то да..
либо убрать

Код: Выделить всё

-- $DAEMON_ARGS

либо, если аргументы нужны, сделать как-то так:

Код: Выделить всё

start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON $DAEMON_ARGS || return 2
Спасибо сказали:
Аватара пользователя
Ленивая Бестолочь
Бывший модератор
Сообщения: 2760
ОС: Debian; gentoo

Re: Скрипт в /etc/init.d/ не работает.

Сообщение Ленивая Бестолочь »

да, это что-то типа отладки.
запускает скрипт и показывает выполняемые строки с подставленными значениями.

вот то место, про которое вы говорите из вышего вывода:
Yaros писал(а):
11.11.2009 12:58
+ start-stop-daemon --start --quiet --pidfile /var/run/tcpdump.pid --exec /usr/sbin/tcpdump -- -s 1500 -n -nn -vvv -w /var/log/tcpd '&'

видно, что происходит при подстановке переменных.
Солнце садилось в море, а люди с неоконченным высшим образованием выбегали оттуда, думая, что море закипит.
Спасибо сказали:
Аватара пользователя
Yaros
Сообщения: 501
ОС: Debian Wheezy / Gentoo

Re: Скрипт в /etc/init.d/ не работает.

Сообщение Yaros »

Код:

defaultuser@coreDebian:~$ sudo /etc/init.d/tcpdump restart Restarting TCPdump: tcpdumpstart-stop-daemon: invalid option -- w Try `start-stop-daemon --help' for more information. failed! defaultuser@coreDebian:~$

если поправить до

Код:

do_start() { # Return # 0 if daemon has been started # 1 if daemon was already running # 2 if daemon could not be started start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null || return 1 start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON $DAEMON_ARGS || return 2 # Add code here, if necessary, that waits for the process to be ready # to handle requests from services started subsequently which depend # on this one. As a last resort, sleep for some time. }
=========
=Мой блог. =
=========
Gentoo-ниасилятар
Спасибо сказали:
Аватара пользователя
Encore
Сообщения: 656
Статус: loading..............
ОС: Debian

Re: Скрипт в /etc/init.d/ не работает.

Сообщение Encore »

хм... start работает у первоначального скрипта, если убрать в DAEMON_ARGS символ "&"

Код: Выделить всё

DAEMON_ARGS="-s 1500 -n -nn -vvv -w /var/log/tcpd"
.......
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_ARGS || return 2
Спасибо сказали:
Аватара пользователя
Yaros
Сообщения: 501
ОС: Debian Wheezy / Gentoo

Re: Скрипт в /etc/init.d/ не работает.

Сообщение Yaros »

Encore писал(а):
11.11.2009 18:22
хм... start работает у первоначального скрипта, если убрать в DAEMON_ARGS символ "&"

Код: Выделить всё

DAEMON_ARGS="-s 1500 -n -nn -vvv -w /var/log/tcpd"
.......
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- $DAEMON_ARGS || return 2

Угу. Но при этом консоль захватывает в свое пользование...
=========
=Мой блог. =
=========
Gentoo-ниасилятар
Спасибо сказали: