• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst]Sorry, wieder mal Probleme mit Startscript

EagleFox

Member
Hallo Leute,

habe mein erstes Startscript erstellt. Bin also blutiger Anfänger. Aber das Script will einfach nicht beim booten laufen. Ich habe folgendes gemacht:

Script erstellt in /etc/init.d:

Code:
#!/bin/sh
#

### BEGIN INIT INFO
# Provides:       antimars
# Required-Start: $network
# Should-Start:   antimars
# Required-Stop:
# Default-Start:  3 5
# Default-Stop:
# Short-Description: Abschalten der "martian source"-Meldungen
# Description:  Start the antimars
### END INIT INFO

logger "antimars: => START!"

#######################
PROG=/root/bin/antimars
#######################

test -e $PROG || { echo "antimars nicht in /root/bin gefunden";
        logger "antimars: => antimars nicht in /root/bin gefunden";
        exit 0; }

. /etc/rc.status

rc_reset


case "$1" in
    start)
        echo -n "Starte antimars " && \
        logger "antimars: => gestartet"
        $PROG
        rc_status -v
    ;;
    stop)
        echo -n "Beende antimars " && \
        killall $PROG
        logger "antimars: beendet"
    ;;
    *)
        echo -n "Usage: $0 {start|stop}" && \
        logger "antimars: => falscher Aufruf"
        exit 1
        ;;
esac
exit 0

in rc5.d und rc3.d habe ich jeweils diese links:
Code:
K17antimars -> ../antimars
S07antimars -> ../antimars

habe dann in /usr/sbin:
Code:
ln -s /etc/init.d/antimars rcantimars
erstellt

Wenn ich das Programm als root in der Konsole mit "rcantimars start" aufrufe, klappt alles wunderbar, nur wird es nicht beim booten gestartet. Ich finde weder Einträge in der Syslog noch hat das aufzurufende Programm etwas getan. Warum nicht? Ich finde in den ganzen HowTos keinen Fehler, den ich gemacht haben könnte.
 

admine

Ultimate Guru
Du hast die Runlevel-Links selbst erstellt ?

Das sollte man eher nicht tun, sondern das mit "insserv" erledigen oder im YaST-Runlevel-Editor.
 
Das Scrip sieht soweit ganz ordentlich aus :wink:
allerdings würde ich das so machen:
Code:
[...]
### BEGIN INIT INFO
# Provides:       antimars
# Required-Start: $syslog $network
# Should-Start:
# Required-Stop:
#[...]
 
OP
E

EagleFox

Member
@admine
Nee, die habe ich über insserv /etc/init.d/antimars erstellt und dann aber weiter nach hinter verschoben, weil die erst S01 waren.

@b3ll3roph0n
Schön zu hören, dass das Script ordentlich aussieht. Bin ja schon ein bisschen stolz als Anfänger. :)
Habe das Script nach Deinen Empfehlungen geändert und werde das nochmal über insserv einbauen. Dann boote ich jetzt mal neu. Ich hoffe das klappt dann so!

Danke schonmal
 
OP
E

EagleFox

Member
Hallo nochmal,

also es ist Erfolg zu melden! Das Script startet nun sauber und schreibt sowohl in messages, als auch in boot.msg rein, wie es sein soll!

Und nun natürlich ein ABER (wobei ich jetzt wahrscheinlich doch Schelle bekomme, wegen schlechtem Code).

Mein aufzurufendes Programm sieht folgender maßen aus:

Code:
#!/bin/sh
#

# Schreibe 0 in die log_martians

MARTIANS=/proc/sys/net/ipv4/conf/all/
if [ -e $MARTIANS/log_martians ]; then
        echo 0 >/proc/sys/net/ipv4/conf/all/log_martians
        echo 0 >/proc/sys/net/ipv4/conf/default/log_martians
        echo 0 >/proc/sys/net/ipv4/conf/eth1/log_martians
        echo 0 >/proc/sys/net/ipv4/conf/eth0/log_martians
        logger "antimars: => Alle Logdateien 'log_martians' bearbeitet"

else
        /etc/init.d/antimars start
        logger "antimars: => Neustart erforderlich"
        exit 0
fi

exit 0

Das unter "else" habe ich geschrieben, weil ich nicht weiß wie man es anstellt, dass er solange warten soll, bis die Dateien (log_martians) da sind und er dann überall Nullen reinschreiben soll.

Das Problem ist, dass diese log_martians immernoch nur ne 1 enthalten, statt ne 0.
Wie kann ich das ändern? Wann werden die überhaupt angelegt?
Ich hoffe Ihr habt nochmal nen Tip für mich!
Tausend Dank im voraus!
 
Hm, mir fehlt da im Moment der Durchblick ... 8)
... also rollen wir das mal auf:
Code:
if [ -e $MARTIANS/log_martians ]; then ...
Also wenn diese Datei existiert ...
... 0 in die Logs schreiben.
Code:
else ...
Andernfalls das Script starten.

Versuch doch mal 1. die paar Zeilen direkt in das Startscript zu schreiben (ohne den else ... Teil).
und 2. das Script um
Code:
Required-Start: $syslog $network $local_fs $remote_fs
erweitern.
(Weil: /proc ist ein Virtuelles Dateisystem, dass beim Start angelegt/gemountet wird)
 
OP
E

EagleFox

Member
Also ich habe das nun nach Deinen Vorschlägen geändert. insserv hat nun die links auf S09 verlegt. Aber immernoch sind die log_martians angeschaltet (also steht ne 1 drin). Ich habe dann mal versucht noch zusätzlich $apache2 (S12) als required angegeben, aber insserv verlegt antimars nicht weiter nach hinten. Höher als S09 kommt er nicht.
Das Programm sieht nun so aus:

Code:
#!/bin/sh
#

### BEGIN INIT INFO
# Provides:       antimars
# Required-Start: $syslog $network $local_fs $remote_fs
# Should-Start:
# Required-Stop:
# Default-Start:  3 5
# Default-Stop:
# Short-Description: Abschalten der "martian source"-Meldungen
# Description:  Start the antimars
### END INIT INFO

logger "antimars: => START!"

#######################
MARTIANS=/proc/sys/net/ipv4/conf/eth1/
#PROG=/root/bin/antimars
#######################

#test -e $PROG || { echo "antimars nicht in /root/bin gefunden";
#       logger "antimars: => antimars nicht in /root/bin gefunden";
#       exit 0; }

. /etc/rc.status

rc_reset


case "$1" in
    start)
        echo -n "Starte antimars "
        logger "antimars: => gestartet"
        if [ -e $MARTIANS/log_martians ]; then
                echo 0 >/proc/sys/net/ipv4/conf/all/log_martians
                echo 0 >/proc/sys/net/ipv4/conf/default/log_martians
                echo 0 >/proc/sys/net/ipv4/conf/eth0/log_martians
                echo 0 >/proc/sys/net/ipv4/conf/eth1/log_martians
                rc_status -v
                logger "antimars: => Alle Logdateien 'log_martians' bearbeitet"
        else
                logger "antimars: => Bearbeitung fehlgeschlagen!"
        fi
    ;;
    stop)
        echo -n "Beende antimars "
        killall $PROG
        logger "antimars: beendet"
    ;;
    *)
        echo -n "Usage: $0 {start|stop}"
        logger "antimars: => falscher Aufruf"
        exit 1
        ;;
esac
exit 0

wobei die stop Option ja jetzut ohne Funktion ist, aber das ist ja egal. Hast Du noch ne Idee?

[EDIT]
hier mal die syslog: http://www.rafb.net/paste/results/kCa4oR73.html
Vielleicht fällt Dir ja da was auf.
 
Hm, hab gerade mal versucht das bei mir zum laufen zu bekommen ... :? reden wir nicht drüber ...

Hast du das ganze mal mit 'sysctl' versucht?
Code:
net.ipv4.conf.all.log_martians = 0
net.ipv4.conf.default.log_martians = 0
net.ipv4.conf.eth0.log_martians = 0
net.ipv4.conf.eth1.log_martians = 0
=> in Datei '/etc/sysctl.conf'
 
OP
E

EagleFox

Member
Also mit sysctl.conf klappt das auch nicht! Hab das, was Du geschrieben hast, eingefügt und neu gebootet, aber die log_martians sind immernoch mit einsen geladen.

Nochmal zurück zum Startscript:
Man muss das doch irgendwie hinbekommen, dass das ganz zum Schluss des Bootvorgangs ausgeführt wird, oder nicht? Wenn ich das Script manuell aufrufe klappt das ja alles. Warum kann ich das nicht als wirklich letzte Aktion starten?
Was ist denn bei Dir passiert, als Du versucht hast das einzubinden? Wohin hat insserv das bei Dir gepackt? Also welche S-Nummer?
Oder sollte man dem script nach dem Aufrufen bei Booten erst mal irgendwie ein sleep verpassen, dass die anderen Sachen alle gestartet werden und es dann erst nach einer gewissen Zeit aktiv wird? Das könnte doch funktionieren, oder?
Wenn ich da z.B. ein "sleep 30" einbastel, läuft der rest vom Bootvorgang dann trotzdem normal weiter?
 
EagleFox schrieb:
Wenn ich da z.B. ein "sleep 30" einbastel, läuft der rest vom Bootvorgang dann trotzdem normal weiter?
Wenn "Runparallel = yes" (oder so ähnlich) in sysconfig gesetzt ist, sollte das klappen.

Aber versuch mal den Displaymanager bei Required-Start hinzuzufügen.
Dann sollte das Script am Ende des Bootvorgangs gestartet werden.

[edit]
Servicename: $xdm
/etc/sysconfig/boot -> RUN_PARALLEL="yes" (Standard)
 
OP
E

EagleFox

Member
Den xdm habe ich bei required eingefügt, aber ohne jedliche Wirkung! insserv packt mir seltsamer Weise immernoch das Startscript an S09, wobei xdm S10 ist. Vielleicht verstehe ich das auch irgendwie alles falsch, aber anscheinend ignoriert insserv ein paar required Einträge. Nach meinem Verständnis sollte das doch hinter xdm verlinkt werden, also irgendwas mit S11, oder so.
In der /etc/sysconfig/boot steht übrigens RUN_PARALLEL="yes".
Ich versuche jetzt einfach mal, ob nur die option $all bei required was bringt!
 
OP
E

EagleFox

Member
ICH HABE ES TATSÄCHLICH GESCHAFFT!!!!!!!!!!!!
Also, hier mein Vorgehen:
Ich habe zunächst in required $all eingetragen. Das führte dazu, dass die links auf S22 gesetzt wurden. Dennoch funktionierte es beim Rebooten nicht.
Dann habe ich wieder den ursprünglichen Zustand mit S09 hergestellt und ein sleep 20 am Anfang des Scripts eingebaut. Laut Syslog hat das Script die Dateien ...log_martians geändert, und zwar genau vor diesen Einträgen:
Code:
Aug 13 02:28:24 eaglefox SuSEfirewall2: Warning: ip6tables does not support state matching. Extended IPv6 support disabled.
Aug 13 02:28:24 eaglefox SuSEfirewall2: Setting up rules from /etc/sysconfig/SuSEfirewall2 ...
Aug 13 02:28:24 eaglefox SuSEfirewall2: batch committing...
Aug 13 02:28:25 eaglefox SuSEfirewall2: Firewall rules successfully set
Ok, also die Firewall setzt die Rules nochmal neu und überschreibt damit meine Einträge. Da haben wir also den Attentäter!
Ich habe dann sleep auf 30 gesetzt, weil ich dachte, dass die Firewall dann ja schon fertig sein müsste. Nein, offensichtlich "wartet" die Firewall bis alle vorherigen Prozesse beendet sind. Also habe ich das Script so abgewandelt, dass es wieder (wie ganz am Anfang) ein weiteres Programm startet (mit Parameter &). Somit läuft das Programm in ner anderen shell und die Firewall "sieht" nichts mehr davon. Das vom Script aufgerufene Programm wartet jetzt 30 Sekunden (dann ist die Firewall auch gerade fertig) und schreibt dann die Einträge in die log_martians! Siehe da, es klappt! Endlich Ruhe vor den Einträgen!

@b3ll3roph0n
Vielen tausend Dank für Deine Mühen!
 
Oben