Seite 1 von 1

Python Script beim starten von Debian laden

Verfasst: Montag 5. Mai 2008, 00:12
von defiance
Hallo,

beim Starten von Debian soll immer mein Pythonscript gestartet werden. Dazu haben ich in der init.d unten aufgeführtes Skript eingefügt. Des weiteren habe ich in der rc5.d unter dem Namen S92script einen Softlink darauf gelegt.

Leider wird das Programm nicht geladen, egal ob eine Konsole geöffnet ist oder nicht.

Muss bei Pythonskripten noch etwas spezielles beim Laden beachtet werden? Der manuelle Aufruf über /etc/init.d/script funktioniert problemlos.

Hier das Startskript

Code: Alles auswählen

#! /bin/sh
# Author: defiance <defiance at XYZ .de>

# 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="Mein Python Skript"
NAME=script
DAEMON=/usr/local/sbin/$NAME.py
DAEMON_ARGS="--options args"
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

:


Verfasst: Montag 5. Mai 2008, 08:02
von Hyperion
Woher weißt Du denn, dass Dein Script nicht geladen wurde? Schreibt es irgendwo rein oder hat es sonst eine persistente Ausgabe?

Ich meine mich zu erinnern, dass es idR Programme gibt, die sich umd ie Einträge in der init.d kümmern und man da nicht unbedingt selber etwas reinschreiben sollte. Du gibst denen die Abhängigkeiten an und den stage, also etwa 3 für Netzwerk usw. Anhand dessen benennt er dann dann Start- bzw. Stop-Script. Da solltest Du noch mal recherchieren.

Verfasst: Montag 5. Mai 2008, 08:45
von Trundle
Hyperion hat geschrieben:Ich meine mich zu erinnern, dass es idR Programme gibt, die sich umd ie Einträge in der init.d kümmern und man da nicht unbedingt selber etwas reinschreiben sollte.
``update-rc.d`` z.B. oder simpler und mit TUI ``rcconf``.

Verfasst: Montag 5. Mai 2008, 09:40
von Rebecca
Debian booted standardmaessig in Runlevel 2 oder 3, da werden die Scripte in rc5.d nicht ausgefuehrt...

Verfasst: Dienstag 6. Mai 2008, 12:32
von defiance
Danke für die Antworten, der Fehler war der Runlevel. Ich habe das Skript nun in den Runlevel 2 verschoben und es läuft.

@Hyperion mein Programm macht zwar keine Ausgaben, aber stellt eine Netzwerkverbindung her, wenn bestimmte Faktoren eintreffen. Sind diese Faktoren erfüllt und es passiert nix, läuft das Skript nicht :-)

Aber eine weiter Frage hat sich mir jetzt noch gestellt. Unter welchem Benutzer wird das Python Skript ausgeführt wenn ich es beim Systemstart lade und wie kann ich es einem anderen Benutzer zuweisen?

Reicht es dafür aus, den Besitzer der Datei zu Ändern mit chown oder wird das anders geregelt?

Verfasst: Dienstag 6. Mai 2008, 12:54
von Trundle
defiance hat geschrieben:Aber eine weiter Frage hat sich mir jetzt noch gestellt. Unter welchem Benutzer wird das Python Skript ausgeführt wenn ich es beim Systemstart lade und wie kann ich es einem anderen Benutzer zuweisen?
``start-stop-daemon`` kennt ``--user``.

Verfasst: Dienstag 6. Mai 2008, 17:37
von Hyperion
defiance hat geschrieben: @Hyperion mein Programm macht zwar keine Ausgaben, aber stellt eine Netzwerkverbindung her, wenn bestimmte Faktoren eintreffen. Sind diese Faktoren erfüllt und es passiert nix, läuft das Skript nicht :-)
Ok ;-) Dennoch würde ich da mal einen logging-Mechanismus einbauen - es kann ja auch mal ein anderes Problem auftreten und seien es Fehler im Code ;-)