Strona 1 z 2
Skrypt uruchamiający nie tworzy mi pliku pid
: 09 marca 2013, 18:43
autor: starach
Cześć,
Poniższy skrypt mający za zadanie uruchomić demona serwisu no-ip.com nie tworzy mi pliku z identyfikatorem procesu. Nie mogę dojść do tego co w nim zepsułem.
Kod: Zaznacz cały
#! /bin/sh
. /lib/lsb/init-functions
PIDFILE="/var/run/noip/noip.pid"
case "$1" in
start)
echo "Starting noip2."
start_daemon -p $PIDFILE /usr/local/bin/noip2
;;
stop)
echo -n "Shutting down noip2."
killproc -p $PIDFILE /usr/local/bin/noip2
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
edit>
Aha doszło właśnie do mnie, że proces noip w ogóle nie jest wyłączany nawet jeśli skasuję feralny fragment z parametrem -p
Co się dzieje?
: 11 marca 2013, 11:23
autor: tom.k
a moze ta 'kropka' po /bin/sh w pierwszej linijce?
pozdrawiam
: 11 marca 2013, 11:45
autor: starach
To include funkcji demona przeniósł mi się do pierwszej linijki przy wklejaniu kodu na forum, ale dzięki
: 11 marca 2013, 15:01
autor: mariaczi
Która wersja Debiana?
Podaj wyniki polecenia
Kod: Zaznacz cały
start_daemon -p /var/run/noip/noip.pid /usr/local/bin/noip2
wykonanego "z palca". Tworzy się plik (/var/run/noip/noip.pid) z identyfikatorem procesu?
: 11 marca 2013, 15:04
autor: starach
Kod: Zaznacz cały
root@starach-debian ~
$ cat /etc/issue
Debian GNU/Linux 6.0 \n \l
root@starach-debian ~
$ uname -a
Linux starach-debian 2.6.32-5-amd64 #1 SMP Mon Feb 25 00:26:11 UTC 2013 x86_64 GNU/Linux
root@starach-debian ~
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 6.0.7 (squeeze)
Release: 6.0.7
Codename: squeeze
root@starach-debian ~
$ ps aux | grep noip
nobody 1887 0.0 0.0 16536 904 ? Ss 15:06 0:00 /usr/local/bin/noip2
root@starach-debian ~
$ lss /var/run/noip/
total 0
Niestety nie tworzy się.
: 11 marca 2013, 15:54
autor: mariaczi
Niestety nie tworzy się.
To masz dla siebie małą podpowiedź, dlaczego proces nie jest zabijany

Bo "skrypt" nie wie, który proces.
Ta sama wersja Debiana, co Twoja:
Kod: Zaznacz cały
srv:~# cat /etc/debian_version
6.0.7
srv:~# start
startpar start-stop-daemon startx
srv:~# which start-stop-daemon
/sbin/start-stop-daemon
Nie wiem, skąd masz "start_daemon" :|
: 11 marca 2013, 16:13
autor: starach
Ale to wiem napisałem w pierwszym poście że nie tworzy mi pliku z identyfikatorem procesu

Za diabła niestety nie wiem dlaczego. Zgaduję że coś nie tak jest z funkcją start_daemon(), noooo albo ze mną. ^^
Mam go z:
Kod: Zaznacz cały
[color=#333333]/lib/lsb/init-functions[/color]
Zawartość:
Kod: Zaznacz cały
# /lib/lsb/init-functions for Debian -*- shell-script -*-#
#Copyright (c) 2002-08 Chris Lawrence
#All rights reserved.
#
#Redistribution and use in source and binary forms, with or without
#modification, are permitted provided that the following conditions
#are met:
#1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#3. Neither the name of the author nor the names of other contributors
# may be used to endorse or promote products derived from this software
# without specific prior written permission.
#
#THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
#IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
#WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
#ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
#LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
#CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
#SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
#BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
#WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
#OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
#EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
start_daemon () {
local force nice pidfile exec i args
force=0
nice=0
pidfile=/dev/null
OPTIND=1
while getopts fn :p : opt ; do
case "$opt" in
f) force=1;;
n) nice="$OPTARG";;
p) pidfile="$OPTARG";;
esac
done
shift $(($OPTIND - 1))
if [ "$1" = '--' ]; then
shift
fi
exec="$1"; shift
args="--start --nicelevel $nice --quiet --oknodo"
if [ $force = 1 ]; then
/sbin/start-stop-daemon $args --chdir "$PWD" --startas $exec --pidfile /dev/null -- "$@"
elif [ $pidfile ]; then
/sbin/start-stop-daemon $args --chdir "$PWD" --exec $exec --oknodo --pidfile "$pidfile" -- "$@"
else
/sbin/start-stop-daemon $args --chdir "$PWD" --exec $exec -- "$@"
fi
}
pidofproc () {
local pidfile line i pids= status specified pid
pidfile=
specified=
OPTIND=1
while getopts p: opt ; do
case "$opt" in
p) pidfile="$OPTARG"; specified=1;;
esac
done
shift $(($OPTIND - 1))
base=${1##*/}
if [ ! "$specified" ]; then
pidfile="/var/run/$base.pid"
fi
if [ -n "${pidfile:-}" -a -r "$pidfile" ]; then
read pid < "$pidfile"
if [ -n "${pid:-}" ]; then
if $(kill -0 "${pid:-}" 2> /dev/null); then
echo "$pid"
return 0
elif ps "${pid:-}" >/dev/null 2>&1; then
echo "$pid"
return 0 # program is running, but not owned by this user
else
return 1 # program is dead and /var/run pid file exists
fi
fi
fi
if [ -x /bin/pidof -a ! "$specified" ]; then
status="0"
/bin/pidof -o %PPID -x $1 || status="$?"
if [ "$status" = 1 ]; then
return 3 # program is not running
fi
return 0
fi
return 4 # Unable to determine status
}
# start-stop-daemon uses the same algorithm as "pidofproc" above.
killproc () {
local pidfile sig status base i name_param is_term_sig
pidfile=
name_param=
is_term_sig=no
OPTIND=1
while getopts p: opt ; do
case "$opt" in
p) pidfile="$OPTARG";;
esac
done
shift $(($OPTIND - 1))
base=${1##*/}
if [ ! $pidfile ]; then
name_param="--name $base --pidfile /var/run/$base.pid"
else
name_param="--pidfile $pidfile"
fi
sig=$(echo ${2:-} | sed -e 's/^-\(.*\)/\1/')
sig=$(echo $sig | sed -e 's/^SIG\(.*\)/\1/')
if [ -z "$sig" -o "$sig" = 15 -o "$sig" = TERM ]; then
is_term_sig=yes
fi
status=0
if [ ! "$is_term_sig" = yes ]; then
if [ -n "$sig" ]; then
/sbin/start-stop-daemon --stop --signal "$sig" --quiet $name_param || status="$?"
else
/sbin/start-stop-daemon --stop --quiet $name_param || status="$?"
fi
else
/sbin/start-stop-daemon --stop --quiet --oknodo $name_param || status="$?"
fi
if [ "$status" = 1 ]; then
if [ -n "$sig" ]; then
return 0
fi
return 3 # program is not running
fi
if [ "$status" = 0 -a "$is_term_sig" = yes -a "$pidfile" ]; then
pidofproc -p "$pidfile" "$1" >/dev/null || rm -f "$pidfile"
fi
return 0
}
# Return LSB status
status_of_proc () {
local pidfile daemon name status
pidfile=
OPTIND=1
while getopts p: opt ; do
case "$opt" in
p) pidfile="$OPTARG";;
esac
done
shift $(($OPTIND - 1))
if [ -n "$pidfile" ]; then
pidfile="-p $pidfile"
fi
daemon="$1"
name="$2"
status="0"
pidofproc $pidfile $daemon >/dev/null || status="$?"
if [ "$status" = 0 ]; then
log_success_msg "$name is running"
return 0
elif [ "$status" = 4 ]; then
log_failure_msg "could not access PID file for $name"
return $status
else
log_failure_msg "$name is not running"
return $status
fi
}
log_use_fancy_output () {
TPUT=/usr/bin/tput
EXPR=/usr/bin/expr
if [ -t 1 ] && [ "x${TERM:-}" != "x" ] && [ "x${TERM:-}" != "xdumb" ] && [ -x $TPUT ] && [ -x $EXPR ] && $TPUT hpa 60 >/dev/null 2>&1 && $TPUT setaf 1 >/dev/null 2>&1; then
[ -z $FANCYTTY ] && FANCYTTY=1 || true
else
FANCYTTY=0
fi
case "$FANCYTTY" in
1|Y|yes|true) true;;
*) false;;
esac
}
log_success_msg () {
if [ -n "${1:-}" ]; then
log_begin_msg $@
fi
log_end_msg 0
}
log_failure_msg () {
if [ -n "${1:-}" ]; then
log_begin_msg $@ "..."
fi
log_end_msg 1 || true
}
log_warning_msg () {
if [ -n "${1:-}" ]; then
log_begin_msg $@ "..."
fi
log_end_msg 255 || true
}
#
# NON-LSB HELPER FUNCTIONS
#
# int get_lsb_header_val (char *scriptpathname, char *key)
get_lsb_header_val () {
if [ ! -f "$1" ] || [ -z "${2:-}" ]; then
return 1
fi
LSB_S="### BEGIN INIT INFO"
LSB_E="### END INIT INFO"
sed -n "/$LSB_S/,/$LSB_E/ s/# $2: \(.*\)/\1/p" $1
}
# int log_begin_message (char *message)
log_begin_msg () {
if [ -z "${1:-}" ]; then
return 1
fi
echo -n "$@"
}
# Sample usage:
# log_daemon_msg "Starting GNOME Login Manager" "gdm"
#
# On Debian, would output "Starting GNOME Login Manager: gdm"
# On Ubuntu, would output " * Starting GNOME Login Manager..."
#
# If the second argument is omitted, logging suitable for use with
# log_progress_msg() is used:
#
# log_daemon_msg "Starting remote filesystem services"
#
# On Debian, would output "Starting remote filesystem services:"
# On Ubuntu, would output " * Starting remote filesystem services..."
log_daemon_msg () {
if [ -z "${1:-}" ]; then
return 1
fi
log_daemon_msg_pre "$@"
if [ -z "${2:-}" ]; then
echo -n "$1:"
return
fi
echo -n "$1: $2"
log_daemon_msg_post "$@"
}
# #319739
#
# Per policy docs:
#
# log_daemon_msg "Starting remote file system services"
# log_progress_msg "nfsd"; start-stop-daemon --start --quiet nfsd
# log_progress_msg "mountd"; start-stop-daemon --start --quiet mountd
# log_progress_msg "ugidd"; start-stop-daemon --start --quiet ugidd
# log_end_msg 0
#
# You could also do something fancy with log_end_msg here based on the
# return values of start-stop-daemon; this is left as an exercise for
# the reader...
#
# On Ubuntu, one would expect log_progress_msg to be a no-op.
log_progress_msg () {
if [ -z "${1:-}" ]; then
return 1
fi
echo -n " $@"
}
# int log_end_message (int exitstatus)
log_end_msg () {
# If no arguments were passed, return
if [ -z "${1:-}" ]; then
return 1
fi
retval=$1
log_end_msg_pre "$@"
# Only do the fancy stuff if we have an appropriate terminal
# and if /usr is already mounted
if log_use_fancy_output; then
RED=`$TPUT setaf 1`
YELLOW=`$TPUT setaf 3`
NORMAL=`$TPUT op`
else
RED=''
YELLOW=''
NORMAL=''
fi
if [ $1 -eq 0 ]; then
echo "."
elif [ $1 -eq 255 ]; then
/bin/echo -e " ${YELLOW}(warning).${NORMAL}"
else
/bin/echo -e " ${RED}failed!${NORMAL}"
fi
log_end_msg_post "$@"
return $retval
}
log_action_msg () {
echo "$@."
}
log_action_begin_msg () {
echo -n "$@..."
}
log_action_cont_msg () {
echo -n "$@..."
}
log_action_end_msg () {
log_action_end_msg_pre "$@"
if [ -z "${2:-}" ]; then
end="."
else
end=" ($2)."
fi
if [ $1 -eq 0 ]; then
echo "done${end}"
else
if log_use_fancy_output; then
RED=`$TPUT setaf 1`
NORMAL=`$TPUT op`
/bin/echo -e "${RED}failed${end}${NORMAL}"
else
echo "failed${end}"
fi
fi
log_action_end_msg_post "$@"
}
# Hooks for /etc/lsb-base-logging.sh
log_daemon_msg_pre () { :; }
log_daemon_msg_post () { :; }
log_end_msg_pre () { :; }
log_end_msg_post () { :; }
log_action_end_msg_pre () { :; }
log_action_end_msg_post () { :; }
FANCYTTY=
[ -e /etc/lsb-base-logging.sh ] && . /etc/lsb-base-logging.sh || true
: 11 marca 2013, 23:15
autor: Rafal_F
Powyższy skrypt wykorzystuje:
Z manuala start-stop-daemon dowiadujemy się:
-m, --make-pidfile
Opcja używana, gdy program sam nie tworzy własnego pliku pid. Wykorzystanie tej opcji spowoduje, że
start-stop-daemon utworzy plik, który został podany w opcji --pidfile i umieści w nim numer pid tuż przed
uruchomieniem procesu. Należy zauważyć, że ta opcja nie skasuje tego pliku po zatrzymaniu programu. UWAGA:
Ta opcja może nie zadziałać w każdym przypadku. Nie zadziała przede wszystkim wtedy, gdy uruchamiany program
utworzy proces potomny. Z tego powodu opcja jest użyteczna jedynie wraz z opcją --background.
Z dokumentacji wynika, że sam przełącznik -p bez żadnych dodatkowych opcji jest wykorzystywany tylko podczas wyłączania usługi. Proponuje skorzystać bezpośrednio ze skryptu:
i dokładnie zapoznać się z dokumentacją powyższego skryptu.
: 12 marca 2013, 02:21
autor: starach
Jeszcze miałem problem z tym że proces chyba tworzył następny proces i się zabijał, ale obszedłem to dodając kod odpowiedzialny za inkrementację zapisanego identyfikatora procesu o jeden.
Dzięki sporo się nauczyłem
Kod: Zaznacz cały
#!/bin/sh
NAME="NOIP2"
DAEMON="/usr/local/bin/noip2"
PIDFILE="/var/run/noip/noip.pid"
case "$1" in
start)
if [ ! -f $PIDFILE ]; then
echo "[$NAME]: Starting $DAEMON"
start-stop-daemon --start -mp $PIDFILE --exec $DAEMON && echo $((`cat $PIDFILE` + 1)) > $PIDFILE
echo "[$NAME]: Running daemon with pid: `cat $PIDFILE`"
else
echo "[$NAME]: $PIDFILE already exists. $DAEMON may be running."
fi
;;
stop)
if [ -f $PIDFILE ]; then
echo "[$NAME]: Shutting down $DAEMON [`cat $PIDFILE`]"
start-stop-daemon --stop -p $PIDFILE
rm $PIDFILE
echo "[$NAME]: Done"
else
echo "[$NAME]: $PIDFILE cannot be found."
fi
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac
exit 0
ostateczna wersja:
Kod: Zaznacz cały
#!/bin/sh
NAME="NOIP2"
DAEMON="/usr/local/bin/noip2"
PIDFILE="/var/run/noip/noip.pid"
output() {
echo "[$NAME]: $1"
}
start() {
output "Starting $DAEMON"
start-stop-daemon --start -mp $PIDFILE --exec $DAEMON && echo $((`cat $PIDFILE` + 1)) > $PIDFILE
output "Running daemon with pid: `cat $PIDFILE`"
}
stop() {
output "Shutting down $DAEMON [`cat $PIDFILE`]"
start-stop-daemon --stop -p $PIDFILE
rm $PIDFILE
output "Done"
}
case "$1" in
start)
if [ ! -f $PIDFILE ]; then
start
else
output "$PIDFILE already exists. $DAEMON may be running."
fi
;;
stop)
if [ -f $PIDFILE ]; then
stop
else
output "$PIDFILE cannot be found."
fi
;;
*)
output "$0 {start|stop}"
exit 1
esac
exit 0
: 12 marca 2013, 03:19
autor: Rafal_F
Nie wiem o co chodzi z inkrementacją, czy zwiększanie PID samemu nie stworzy problemu przy zamykaniu? Założenie, że nowy proces ma pid większy o 1 jest bez sensu. Oprócz sprawdzania czy istnieje plik możesz sprawdzić czy usługa jest uruchomiona poprzez odpowiednie parsowanie wyjścia polecenia:
I stworzyć parę sytuacji:
- plik istnieje i usługa uruchomiona
- plik istnieje i usługa nie jest uruchomiona
- plik nie istnieje i usługa nie jest uruchomiona
- plik nie istnieje i usługa uruchomiona - chyba najmniej prawdopodobne
Może problem z powielaniem procesów (jeżeli o to właśnie chodzi) wynika z nie przewidzenia jednej z powyższych sytuacji.