shell - code

Bash, Shell, PHP, Python, Perl, CGI
at120
Posts: 31
Joined: 2003-05-24 21:18

shell - code

Post by at120 »

Hallo!

Folgende Frage. Was macht dieser Code genau?


while [ 1 ]; do
if [ ! $(pidof $SERVER_BIN) ]; then
screen -d -m chroot $SERVER_ROOT su -
$SERVER_USER $SERVER_OPTIONS

# speziell dieser teil. wie kann ich su machen ohne passwort, als
# normaler user? check ich nicht ganz.

sleep 1
if [ ! $(pidof $SERVER_BIN) ]; then
echo "
Could not find a PID for ${SERVER_BIN}!"
rm $PIDFILE
exit;
fi
echo `pidof $SERVER_BIN` > $SERVER_PIDFILE
fi
sleep 30;
done;


Danke für die Hilfestellung/Erklärung!

MfG Alex
dea
Posts: 532
Joined: 2002-08-13 12:05

Re: shell - code

Post by dea »

at120 wrote:Hallo!

Folgende Frage. Was macht dieser Code genau?

Code: Select all

while [ 1 ]; do
	if [ ! $(pidof $SERVER_BIN) ]; then 
		screen -d -m chroot $SERVER_ROOT su - 
			$SERVER_USER $SERVER_OPTIONS 

# speziell dieser teil. wie kann ich su machen ohne passwort, als 
# normaler user? check ich nicht ganz.

		sleep 1
		if [ ! $(pidof $SERVER_BIN) ]; then
			echo "
Could not find a PID for ${SERVER_BIN}!"
			rm $PIDFILE 
			exit;
		fi
		echo `pidof $SERVER_BIN` > $SERVER_PIDFILE
	fi
	sleep 30;
done;
Also:


Hier handelt es sich um eine Endlosschleife in der ca. alle 30 sek. geprüft wird, ob ${SERVER_BIN} noch existiert (eine PID hat). Wenn dem nicht mehr sein sollte wird screen im detached mode gestartet und die Kommandos 'chroot ${SERVER_ROOT}' und 'su ${SERVER_USER} ${SERVER_OPTIONS}' ausgeführt.
Anschließend wird nach einer Sekunde noch einmal geprüft, ob ${SERVER_BIN} läuft (also eine PID dazu existiert). Wenn nicht, wird eine Fehlermeldung ausgegeben, das eventuell vorhandene ${PIDFILE} gelöscht und das Skript beendet sich. Läuft ${SERVER_BIN} wird die dazugehörige PID nach ${PIDFILE} geschrieben und die Schleife geht wieder von vorne los.

Zu Deiner Frage wegen des 'su': Entweder hat ${SERVER_USER} kein Passwort, der User-Kontext unter dem das Skript ausgeführt wird ist 'root' (root darf ohen Passwort su-en) oder ${SERVER_OPTIONS} enthält das Passwort. So kann es gehen.

http://tldp.org/LDP/abs/html/index.html

So wirklich gut geschrieben ist dieses Skript allerdings nicht - es funktioniert im Fehlerfall genau einmal ... :/
at120
Posts: 31
Joined: 2003-05-24 21:18

Re: shell - code

Post by at120 »

wieso rennt der script nur einmal?
wg. su:

was ist wenn ich den script in /etc/rc.d/init.d/rc.server_start reingebe?
brauche ich da auch ein passwort?

mfg alex
captaincrunch
Userprojekt
Userprojekt
Posts: 7066
Joined: 2002-10-09 14:30
Location: Dorsten

Re: shell - code

Post by captaincrunch »

Wenn du's per su machst auf jeden Fall. Zu diesem Zweck wäre sudo besser geeignet. Mir ist nur immer noch nicht ganz klar, was du damit anfangen willst ... weißt du es wenigstens ? ;)
DebianHowTo
echo "[q]sa[ln0=aln256%Pln256/snlbx]sb729901041524823122snlbxq"|dc
dea
Posts: 532
Joined: 2002-08-13 12:05

Re: shell - code

Post by dea »

at120 wrote:wieso rennt der script nur einmal?
Desderwegens:

Code: Select all

if [ ! $(pidof $SERVER_BIN) ]; then
  echo "Could not find a PID for ${SERVER_BIN}!"
  rm $PIDFILE
  exit;
fi 
Genauer gesagt wegen der Anweisung 'exit'. Damit wird das Skript beendet. Das beduetet bei diesem Skript, dass es nur einen einzigen Versuch gibt, ${SERVER_BIN} neu zu starten. Sinnvoller wären hier eventuell mehrere Versuche bzw. erste Anläufe zur Fehlererkennung und -behebung, denn wenn das mitten in der Nacht passiert wirst Du das Problem erst beim nächsten Login erkennen - wenn Du danach suchst :/
wg. su:

was ist wenn ich den script in /etc/rc.d/init.d/rc.server_start reingebe?
brauche ich da auch ein passwort?
Rein theoretisch nicht - die init-Skripte laufen im Allgemeinen unter ID 0 (= root). Aber ist das sinnvoll?

Schau Dir doch mal /etc/init.d/functions an (unter Debian: 'man start-stop-daemon' et. al.), dort findest Du Funktionalität zum sauberen Starten und Stoppen von Diensten ...