Init Script

Hi,

ich habe mir für ein Script in Init Script gebastelt. Dabei hab ich mich an in vorhandes angelehnt (ist das erst Mal dass ich sowas mache):

Code:
#! /bin/sh
NAME="autorotate"
DESC="Rotates the screen according to HDAPS sensors"
SCRIPTNAME="/etc/init.d/autorotate"
DAEMON="/usr/local/bin/$NAME"
PIDFILE="/var/run/$NAME.pid"
LOGFILE="/var/log/autorotate"

start() {
	start-stop-daemon --start -b --exec $DAEMON > $LOGFILE
}

stop() {
	sudo start-stop-daemon --stop --verbose --name $NAME
}

pause() {
	start-stop-daemon --stop --signal 10 --quiet --pidfile $PIDFILE --name $NAME
}


case "$1" in
  start)
	echo "Starting autorotate daemon..."
	start
	;;
  stop)
	echo "Stopping autorotate daemon..."
	stop
	;;
  pause) 
	echo "Pausing autorotate daemon..."
	pause
	;;
  restart|force-reload)
	echo "Restarting autorotate daemon..."
	stop
	start
	;;
  *)
	echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload|pause}" >&2
	exit 3
	;;
esac

:

Problem liegt bei der LOGFILE Sache. Ich schätze Mal dadurch, dass ich -b als Parameter an star-stop-daemon übergebe (detach) landet der Output von /usr/local/bin/autorotate nicht in dem log file. Was kann ich dagegen tun?

2. Sache: Was bedeutet ">&2" in der Zeile in der "Usage:..." ausgegeben wird?


mfg
serow
 
Hä? Wie jetzt?

In dem Script gibts ein paar echo(s) die ich gern im log file hätte. Oder macht man das anders?
 
Wenn ich das jetzt richtig verstanden hatte ( wusste das auch noch nicht ) ,
leitet das >&2 auch die fehlermeldungen in die datei um(stderr)
 
2>&1 sorgt dafür, dass sowohl STDERR als auch STDIN in die gleiche Richtung umgeleitet werden. Ist also vorher eine Umleitung mittels '>>' oder '>' definiert, landet jeglicher Output dort. Verwendet man es hingegen nicht, wird nur der STDOUT umgeleitet.
 
Also wenn ich
Code:
start-stop-daemon --start -b --exec $DAEMON > $LOGFILE
in
Code:
start-stop-daemon --start -b --exec $DAEMON > $LOGFILE 2>&1
ändere, tut sich garnichts.

In dem Script /usr/local/bin/autorotate mach ich einfach immer nur das hier:
Code:
echo "Blablubb"

Wo muss ich denn jetzt mit diesem 2>&1 hin? Muss das nach jedem echo in /usr/local/bin/autorotate stehn? Kann man das nicht über das Init Script regeln? Bzw wir sieht die best practice aus?
 
Dein Problem dürfte eher die einfache spitze Klammer '>' sein. Diese sorgt dafür, dass die Datei komplett überschrieben wird und der neue Output nicht angehängt. Dadurch bekommst du in der Datei nur die letzte Ausgabe des Skripts. Hinzu kommt, dass start-stop-daemon meines Wissens nach den Output eh abfängt und an das syslog-System übergibt.
 
Bringt alles nix. Weder Output in /var/log/autorotate noch in /var/log/syslog. Also nochmal zusammengefasst, die ganzen Scripte:


/usr/local/bin/autorotate
Das echo ist in Zeile 79
Code:
#!/bin/bash

export IFS=" "

############################################################
## CONSTANTS ###############################################
############################################################ 
SLEEP_TIME=1
LAPTOP_MODE_FILE=/etc/tabletmode
MODE_TABLET=tablet
MODE_LAPTOP=laptop
CALIBRATE_FILE=/sys/devices/platform/hdaps/calibrate
RESISTANCY=50
POSITION_FILE=/sys/devices/platform/hdaps/position
XRANDR=("normal" "right" "inverted" "left")
WACOM=("0" "1" "3" "2")
BUTTONS=("103 106 108 105" "105 103 106 108" "108 105 103 106" "106 108 105 103" "71 6d 6f 6e")

############################################################
## VARIABLES ###############################################
############################################################
orientation=-1
next_orientation=-1
calibX=`cut -d , -f 1 < $CALIBRATE_FILE | sed "s/(//"`
calibY=`cut -d , -f 2 < $CALIBRATE_FILE | sed "s/)//"`
minX=$(($calibX-$RESISTANCY))
minY=$(($calibY-$RESISTANCY))
maxX=$(($calibX+$RESISTANCY))
maxY=$(($calibY+$RESISTANCY))	

############################################################
## MAIN LOOP STARTS HERE ###################################
############################################################
while :
do
	sleep $SLEEP_TIME

	laptopMode=`cat $LAPTOP_MODE_FILE`

	if [ "$laptopMode" = "$MODE_LAPTOP" ]
	then
		laptop_status=$MODE_LAPTOP
		next_orientation=0
	else
		if [ "$laptop_status" = "$MODE_LAPTOP" ]
		then
			laptop_status=$MODE_TABLET
			next_orientation=2
		fi
	
		posX=`cut -d , -f 1 < $POSITION_FILE | sed "s/(//"`
		posY=`cut -d , -f 2 < $POSITION_FILE | sed "s/)//"`		
			
		if [ $posY -gt $maxY -a $minX -lt $posX -a $posX -lt $maxX ]
		then
			next_orientation=2 #inverted
		else 
			if [ $posY -lt $minY -a $minX -lt $posX -a $posX -lt $maxX ]
			then
				next_orientation=0 #normal
			else
				if [ $posX -lt $minX -a $minY -lt $posY -a $posY -lt $maxY ]
				then
					next_orientation=3 #left
				else
					if [ $posX -gt $maxX -a $minY -lt $posY -a $posY -lt $maxY ]
					then	
						next_orientation=1 #right
					fi
				fi
			fi
		fi
	fi

	if [ "$orientation" != "$next_orientation" ]
	then
		orientation=$next_orientation

		echo "Changing Screen Orientation: ${XRANDR[$orientation]}"

		xrandr --output LVDS --rotation ${XRANDR[$orientation]}
		xsetwacom set stylus Rotate ${WACOM[$orientation]}

		i=0
		while [ $i -lt 4 ]
		do
			setkeycodes `echo ${BUTTONS[4]} | cut -d " " -f $(($i + 1))` `echo ${BUTTONS[$orientation]} | cut -d " " -f $(($i + 1))`
			i=$(($i + 1))
		done
	fi
done
/etc/init.d/autorotate
Code:
#! /bin/sh
NAME="autorotate"
DESC="Rotates the screen according to HDAPS sensors"
SCRIPTNAME="/etc/init.d/autorotate"
DAEMON="/usr/local/bin/$NAME"
PIDFILE="/var/run/$NAME.pid"
LOGFILE="/var/log/autorotate"

start() {
	start-stop-daemon --start -b --exec $DAEMON >> $LOGFILE 2>&1
}

stop() {
	start-stop-daemon --stop --verbose --name $NAME
}

pause() {
	start-stop-daemon --stop --signal 10 --quiet --pidfile $PIDFILE --name $NAME
}


case "$1" in
  start)
	echo "Starting autorotate daemon..."
	start
	;;
  stop)
	echo "Stopping autorotate daemon..."
	stop
	;;
  pause) 
	echo "Pausing autorotate daemon..."
	pause
	;;
  restart|force-reload)
	echo "Restarting autorotate daemon..."
	stop
	start
	;;
  *)
	echo "Usage: $SCRIPTNAME {start|stop|restart|force-reload|pause}" >&2
	exit 3
	;;
esac

Und es tut sich weder in /var/log/syslog noch in /var/log/autorotate etwas.

EDIT: keine Ideen?
 
Zurück
Oben