Startscript problem

Status
Für weitere Antworten geschlossen.

DI4bI0

Benutzer
Mitglied seit
08. Mrz 2011
Beiträge
264
Punkte für Reaktionen
14
Punkte
24
Guten Abend Community,

ich habe da ein kleines Problem mit meinem Startscript für den ddclient.

Hier erstmal das Script:
Rich (BBCode):
#!/opt/bin/bash
#
# init.d/ddclient
#
### BEGIN INIT INFO
# Provides: ddclient
### END INIT INFO

CONFIG="/opt/etc/ddclient/ddclient.conf"

# Check if the config file exists. If not exit 1
if [ ! -f "$CONFIG" ]; then
	echo "ERROR config file is missing!"
	exit 1
fi

case "$1" in
	start)
		if [[ -z `ps aux | grep -v grep | grep ddclient` ]]; then
			echo "Starting ddclient"
			ddclient
		else
			echo "ddclient is already running"
			exit 1
		fi
	;;
	 
	stop)
		if [[ ! -z `ps aux | grep -v grep | grep ddclient` ]]; then
			echo "Shutting down ddclient"		
			kill `ps aux | grep -v grep | grep ddclient | awk '{print $2}'`
		else
			echo "ddclient is not running"
			exit 1
		fi
	;;
	restart)
		$0 stop && $0 start || exit 1
	;;
	status)
		ps aux | grep -v grep | grep ddclient > /dev/null
		CHECK=$?
		[ $CHECK == 0 ] && echo -e "ddclient ist online" || echo -e "ddclient is down"
	;;
	debug)
		echo `ps aux | grep -v grep | grep ddclient | awk '{print $2}'`
		echo `ps aux | grep -v grep | grep ddclient`
	;;
	*)
	echo "Usage: $0 {start|stop|restart|status|debug}"
	exit 1
esac
exit 0

Das Problem ist nun, das Script denkt das der Prozess immer läuft, egal ob er läuft oder nicht.
Deshalb habe ich zu Testzwecken den punkt debug im Script eigefügt und siehe da das problem ensteht nur wenn das script den Befehl `ps aux | grep -v grep | grep ddclient` ausführt.


Wenn das script den Befehl `ps aux | grep -v grep | grep ddclient` ausführt bekomme ich:
Rich (BBCode):
root 28791 0.0 0.0 7328 4212 pts/2 S+ 19:34 0:00 ddclient - sleeping for 580 seconds root 28832 0.0 0.0 3692 964 pts/2 S+ 19:34 0:00 /opt/bin/bash ./S05ddclient.sh debug root 28838 0.0 0.0 3692 344 pts/2 S+ 19:34 0:00 /opt/bin/bash ./S05ddclient.sh debug

Wenn ich den Befehl `ps aux | grep -v grep | grep ddclient` allerdings über die console eingebe bekomme ich genau das was ich haben will:
Rich (BBCode):
root 29162 0.0 0.0 7328 4208 pts/2 S+ 19:37 0:00 ddclient - sleeping for 510 seconds

Wiso ich jetzt unterschiedliche ausgaben bekomme, kann ich nicht nachvollziehen.

Ich hoffe ihr könnt mir da weiterhelfen.


mfg
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
schreibe mal im Skript vor jedes Kommando den kompletten Pfad ... also /bin/ps bzw. /opt/bin/ps usw. usw. und erzähle uns, was sich so tut ...

Itari
 

fpo4711

Benutzer
Mitglied seit
26. Mai 2010
Beiträge
2.772
Punkte für Reaktionen
1
Punkte
0
Hallo,

vieleicht hast Du zwei Versionen auf deiner DS. Z.Bsp. durch IPKG o.ä. installiert. Welche Version Du über die Console nutzt kannst Du mit

Rich (BBCode):
which ps

sehen und dann den kompletten Pfad in deinem Script verwenden.

Gruß Frank
 

DI4bI0

Benutzer
Mitglied seit
08. Mrz 2011
Beiträge
264
Punkte für Reaktionen
14
Punkte
24
Erstmal vielen dank für die schnellen Antwoten. :)

Habe das script jetzt mal mit kompletten Pfaden angepasst:
Rich (BBCode):
#!/opt/bin/bash
#
# init.d/ddclient
#
### BEGIN INIT INFO
# Provides: ddclient
### END INIT INFO

#===================================================================
#	LIBRARIES
#===================================================================

PS="$(which ps)"
if [ -z "$PS" ]; then
	echo "Error: ps not found"
	exit 1
fi

GREP="$(which grep)"
if [ -z "$GREP" ]; then
	echo "Error: grep not found"
	exit 1
fi

AWK="$(which awk)"
if [ -z "$AWK" ]; then
	echo "Error: awk not found"
	exit 1
fi

DDCLIENT="$(which ddclient)"
if [ -z "$DDCLIENT" ]; then
	echo "Error: ddclient not found"
	exit 1
fi

CONFIG="/opt/etc/ddclient/ddclient.conf"

# Check if the config file exists. If not exit 1
if [ ! -f "$CONFIG" ]; then
	echo "ERROR config file is missing!"
	exit 1
fi

case "$1" in
	start)
		if [[ -z `$PS aux | $GREP -v grep | $GREP ddclient` ]]; then
			echo "Starting ddclient"
			ddclient
		else
			echo "ddclient is already running"
			exit 1
		fi
	;;
	 
	stop)
		if [[ ! -z `$PS aux | $GREP -v grep | $GREP ddclient` ]]; then
			echo "Shutting down ddclient"		
			kill `$PS aux | $GREP -v grep | $GREP ddclient | awk '{print $2}'`
		else
			echo "ddclient is not running"
			exit 1
		fi
	;;
	restart)
		$0 stop && $0 start || exit 1
	;;
	status)
		$PS aux | $GREP -v grep | $GREP ddclient > /dev/null
		CHECK=$?
		[ $CHECK == 0 ] && echo -e "ddclient ist online" || echo -e "ddclient is down"
	;;
	debug)
		echo `$PS aux | $GREP -v grep | $GREP ddclient | $AWK '{print $2}'`
		echo `$PS aux | $GREP -v grep | $GREP ddclient`
		echo -e "$PS\n$GREP\n$AWK\n$DDCLIENT"
	;;
	*)
	echo "Usage: $0 {start|stop|restart|status|debug}"
	exit 1
esac
exit 0

Wenn ich nun das Script mit dem Parameter debug starte bekomme ich vollgendes:
Rich (BBCode):
740 1105 1110
root 740 0.0 0.0 7328 4232 ? S 20:17 0:00 ddclient - sleeping for 160 seconds root 1105 0.0 0.0 3692 1096 pts/0 S+ 21:06 0:00 /opt/bin/bash ./S05ddclient.sh debug root 1116 0.0 0.0 3692 352 pts/0 S+ 21:06 0:00 /opt/bin/bash ./S05ddclient.sh debug
/opt/bin/ps
/opt/bin/grep
/opt/bin/awk
/opt/sbin/ddclient

Hat also leider nichts gebracht da die Pfade mit den Pfaden in der console übereinstimmen.
 
Zuletzt bearbeitet:

fpo4711

Benutzer
Mitglied seit
26. Mai 2010
Beiträge
2.772
Punkte für Reaktionen
1
Punkte
0
Und zum Test hast Du das Startscript von der Console aufgerufen?

Nimm doch mal

Rich (BBCode):
/bin/ps

Gruß Frank

Edit: Gerade gesehen - die Version unter /bin unterstützt diese Parameter nicht. Mittlererweise hat ja itari schon die Lösung präsentiert.
 
Zuletzt bearbeitet:

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
mach mal im Skript:

$PS aux | $GREP -v grep | $GREP ddclient | head -1

Itari
 

DI4bI0

Benutzer
Mitglied seit
08. Mrz 2011
Beiträge
264
Punkte für Reaktionen
14
Punkte
24
Mit head hatte ich auch schon probiert, was aber leider auch nicht zur Lösung führte.

Wenn nämlich der ddclient nicht läuft und über das Script `$PS aux | $GREP -v grep | $GREP ddclient | head -n 1` ausgeführt wird bekomme ich:
Rich (BBCode):
root 1257 0.0 0.0 3692 1092 pts/0 S+ 21:33 0:00 /opt/bin/bash ./S05ddclient.sh debug
Normalerweise sollte da ja nichts erscheinen da der ddclient ja nicht läuft.
 

itari

Benutzer
Mitglied seit
15. Mai 2008
Beiträge
21.900
Punkte für Reaktionen
14
Punkte
0
benenn mal dein Skript um, so dass der Name deines Programms und der Name des Skriptes nicht identisch ist und vom grep ausgeworfen wird

Itari
 

DI4bI0

Benutzer
Mitglied seit
08. Mrz 2011
Beiträge
264
Punkte für Reaktionen
14
Punkte
24
Oh man genau das war es!
Vielen Dank, ich glaube da wäre ich nie drauf gekommen xD

mfg


Edit:

So habe das Script jetzt mal so umgebaut, das es auch mit dem Dateinamen klappt.
Rich (BBCode):
#!/opt/bin/bash
#
# init.d/ddclient
#
### BEGIN INIT INFO
# Provides: ddclient
### END INIT INFO

##
## settings
##
CONFIG="/opt/etc/ddclient/ddclient.conf"
DESC="ddclient"

##
## LIBRARIES
##
PS="$(which ps)"
if [ -z "$PS" ]; then
	echo "Error: ps not found"
	exit 1
fi

GREP="$(which grep)"
if [ -z "$GREP" ]; then
	echo "Error: grep not found"
	exit 1
fi

AWK="$(which awk)"
if [ -z "$AWK" ]; then
	echo "Error: awk not found"
	exit 1
fi

DDCLIENT="$(which ddclient)"
if [ -z "$DDCLIENT" ]; then
	echo "Error: ddclient not found"
	exit 1
fi

##
## Check if the config file exists.
##
if [ ! -f "$CONFIG" ]; then
	echo "ERROR config file is missing!"
	exit 1
fi

##
## Important if the script name contains the processname!
##
SCRIPTNAME="$0"

case "$1" in
	start)
		if [[ -z `$PS aux | $GREP -v grep | $GREP -v $SCRIPTNAME | $GREP ddclient` ]]; then
			echo "Starting $DESC"
			$DDCLIENT
		else
			echo "$DESC is already running"
			exit 1
		fi
	;;
	 
	stop)
		if [[ ! -z `$PS aux | $GREP -v grep | $GREP -v $SCRIPTNAME | $GREP ddclient` ]]; then
			echo "Shutting down $DESC"		
			kill `$PS aux | $GREP -v grep | $GREP -v $SCRIPTNAME | $GREP ddclient | awk '{print $2}'`
		else
			echo "$DESC is not running"
			exit 1
		fi
	;;
	
	restart)
		$0 stop && $0 start || exit 1
	;;
	
	status)
		$PS aux | $GREP -v grep | $GREP -v $SCRIPTNAME | $GREP ddclient > /dev/null
		CHECK=$?
		[ $CHECK -eq 0 ] && echo -e "$DESC is running" || echo -e "$DESC is not running"
	;;
	
	*)
		echo "Usage: $0 {start|stop|restart|status}"
		exit 1
	;;
esac
exit 0
Vielleicht hat ja mal jemand das gleiche Problem :)
 
Zuletzt bearbeitet:
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat