Automatisches starten einer Anwendung beim Systemstart

Huemler

Mitglied
Hallo,
ich habe folgendes Problem.
Ich möchte, dass ein von mir geschriebenes C-Programm nach dem Systemstart automatisch startet.
Zu meiner Arbeitsumgebung:Ich arbeite mit einem embedded Linux Image auf einem Board.
Ich kenn mich aber leider noch nicht so extrem super mit Linux aus, deshalb hab ich jetzt schon ewig im Netz gesucht, was ich dafür tun muss.
Also ich weiß, dass ich in etc/rc.d etwas eintragen muss, im Startscript was verändern muss und eine Dämonisierung durchführen muss.
Aber irgendwie komm ich gerade nicht weiter.
Hat jemand schon so etwas selber gemacht und könnte mir einen Tipp oder einen Link den ich vielleicht noch nicht gefunden habe schicken?

Vielen Dank und Gruß
Huemler
 
Um eine Anwendung beim Systemstart zu laden und in den Speicher zu legen, musst Du nur folgendes tun:

öffne in /etc/rc.d/int.d das Script rc.local und trage dort deine Anwendung mit Pfad dazu ein, falls sie nicht in /bin, /usr/bin,/sbin oder /usr/sbin liegt. Die Datei sieht dann ungefähr SO aus:
Code:
#!/bin/sh

exec /pfad/anwendung &
Dieses Script wird zuletzt im jeweiligen Runlevel des Systems beim starten ausgeführt.
Die Runlevel sind vom Prinzip nix anderes wie bei Windows versch. Arten des System-Starts, nur dass es bei Linux gravierende Unterschiede gibt:
Runlevel 0: Herunterfahren
Runlevel 1: sozusagen "abgesicherter Modus", es gibt keine GUI und kein Netzwerk und versch. Dienste werden nicht ausgeführt
Runlevel 2: wie Runlevel 1, wird jedoch selten verwendet
Runlevel 3: NUR Netzwerk, keine GUI, Dienste werden zum grössten Teil ausgeführt
Runlevel 4: selten verwendet, macht dasselbe wie Runlevel 3
Runlevel 5: Netzwerk + GUI, alle Dienste werden gestartet
Runlevel 6: Systemneustart

Die Ordnerstruktur in /etc/rc.d beschreibt die Runlevel: rc0.d, rc1.d,rc2.d etc.
Wenn Du nun in die Ordner rc[0-6].d schaust, sieht Du versch. Links zu den Startscripten die in /etc/rc.d/init.d liegen, die Bedeutung mit den Buchstaben ist folgende:
S = Start-Script
K = Stop-Script (wird beim Herunterfahren des Runlevel ausgeführt)

Die Bedeutung der Zahlen hinter den Buchstaben erklärt sich so, dass sie die Reihenfolge der Abarbeitung beinhalten, so wird zB bei dem Script
S01boot folgendes gemacht:
Es ist ein Startscript, das mit zuerst abgearbeitet wird und das Script "/etc/rc.d/init.d/boot" ausführt.

Es gibt noch Systemweite Script,die abgearbeitet werden, so also welche die unabhängig vom Runlevel sind:
rc.start (oder NUR "rc"), rc.boot und rc.local

Das Problem ist jetzt nur, dass es von System zu System kleine Unterschiede gibt, aber generell ist das Init-System so aufgebaut.

Ich hoffe, ich konnte Dir etwas helfen :)
LG
Andy
 
Zuletzt bearbeitet:
Hallo Andy,
danke für deine schnelle Antwort.
Das Problem ist wohl, das ich ja mit einem embedded Linux auf einem Board arbeite.
Denn mein /etc sieht folgendermaßen aus:
ich habe /etc/init.d mit folgenden Einträgen:
banner modules pure-ftpd telnetd udev
inetd networking rcS thttpd xorg

und /etc/rc.d mit folgenden Einträgen:
S00_udev S02_networking S10_thttpd
S01_modules S07_telnetd S11_inetd
S02_banner S09_pureftpd S13_xorg

das heißt, rc.local und rc[0-6] gibt es so bei mir garnicht.
wie gesagt es gibt nur direkt unter /etc das Verzeichnis init.d und rc.d.

Wie würdest du dann da vorgehen?

Gruß
Huemler
 
Ist kein Problem denke ich, da Dein System natürlich arg abgespeckt ist - ein embedded Sys braucht natürlich nicht die volle Funktionsvielfalt eines "echten" OS - Windows-Mobile wird ja auch keine 3 GB Platz brauchen :)

Zur Erklärung:
S00_udev = Starten der System-Hardware-Erkennung durch udev
S01_modules = Starten/Laden von System--Treibern
S02_networking = Festlegen der IP, Gateway und DNS des Linux
S02_banner = Eine Art "Begrüssung", wenn das Gerät/System gestartet wird
S07_telnetd = Ein Dienst, um mit Telnet drauf zuzugreifen
S09_pureftpd = ist ein kleiner FTP-Server, um Daten zu tauschen
S10_thttpd = Ist ein Minimaler Webserver, der evtl. Zur Konfiguration des Gerätes genutzt wird
S11_inetd = Eine Anwendung, die weitere Dienste Startet (Konfig dazu müsste in /etc/inetd.conf sein)
S13_xorg ist die Grafische Oberfläche des Linux (ehemals X11) und kann versch. Oberflächen starten (KDE,Gnome,XFCE ...andere Mobile-Oberflächen wie QTopia etc)

Um nun Dein Problem zu lösen, müsstest Du mal ein Script aus /etc/rc.d posten, damit ich Dir das anpassen kann - hab leider keine Ahnung, wie das aufgebaut ist

LG
Andy
 
OK mach ich gerne.
Nur sehn die Scripte alle anders aus, deswegen poste ich mal paar verschiedene.

C:
S07_telnetd z.B. sieht folgendermaßen aus:
#!/bin/sh
#
# /etc/init.d/telnetd
#
# $Id: telnetd 2827 2005-06-17 12:19:46Z sha $
#

if [ -f /usr/sbin/telnetd ]; then
        echo "Starting telnetd..."
        /usr/sbin/telnetd
        exit 0
fi

if [ -f /sbin/utelnetd ]; then
        echo "Starting utelnetd..."
        /sbin/utelnetd -d
        exit 0
fi

echo "No telnetd found. Aborting"


S13_xorg sieht folgendermaßen aus:
#!/bin/sh
#
# Xorg server
#

PREFIX="xorg: "
THISFILE=$0
PIDFILE="/tmp/.X0-lock"

usage() {
        echo "${PREFIX}usage: $THISFILE [start|stop]"
}

case $1 in

        start)
                echo "${PREFIX} starting"
                if [ -e "$PIDFILE" ]; then
                        echo "${PREFIX} Another xorg server seems to be running"
                        exit 1
                fi
                /usr/bin/xinit /etc/X11/xinitrc 2>/dev/null 1>/dev/null &
                ;;

        stop)
                echo "${PREFIX} stopping"
                if [ ! -e "$PIDFILE" ]; then
                        echo "${PREFIX} there seems to be no server running"
                        exit 1
                fi
                kill `cat $PIDFILE`
                rm -f $PIDFILE
                echo "${PREFIX} done"
                ;;

        *)

                usage
                exit 1
                ;;

esac

S02_networking z.B so
#!/bin/sh

echo "starting network interfaces..."
ifup -a

exit 0


und S10_thttpd z.B so:
#!/bin/sh
#
# thttpd
#

PREFIX="thttpd: "
THISFILE=$0
DOCUMENTROOT="/var/www"
thttpd="/usr/sbin/thttpd"
PIDFILE="/var/run/thttpd.pid"
LOGFILE="/var/log/thttpd.log"

usage() {
        echo "${PREFIX}usage: $THISFILE [start|stop]"
}

case $1 in

        start)
                echo "${PREFIX} starting"
                if [ -e "$PIDFILE" ]; then
                        echo "${PREFIX} warning: another thttpd seems to be run"
                        kill -9 `cat $PIDFILE`
                        rm -f $PIDFILE
                fi
                $thttpd -d $DOCUMENTROOT -u www -nor -nos -p 80 -c '**.cgi' -i E
                if [ "$?" != "0" ]; then
                        echo "${PREFIX} error, could not start server"
                        rm -f $PIDFILE
                else
                        echo "${PREFIX} done"
                fi
                ;;

        stop)
                echo "${PREFIX} stopping"
                kill -USR1 `cat $PIDFILE`
                rm -f $PIDFILE
                echo "${PREFIX} done"
                ;;

        *)

                usage
                exit 1
                ;;

esac

ich hoff eins der geposteten Skripte nützt was für mein Problem :)
Wär echt super wenn das klappen würde, weil ich blick da wirklich grad irgendwie nicht durch was ich machen muss.

LG
Oli
 
Anhand des Telnet-Scriptes sehe ich,dass Dein System scheinbar kein "start-beautify" hat, somit also beiden Scripten den parameter "start" nicht zwingend erfordert.

somit kannst Du also folgendes Script ganz einfach erstellen:
Code:
cat > /etc/init.d/deineAnwendung << "EOF"
#!/bin/sh

echo "Starting DEINE_ANWENDUNG..."
/pfad/anwendung

exit 0
EOF

dann noch
Code:
chmod 755 /etc/init.d/S12_DeineAnwendung
das macht das Script ausführbar und sollte dann beim nächsten Start mit geladen werden,nachdem Du das verlinkt hast:
Code:
ln -s /etc/init.d/deineAnwendung /etc/rc.d/S12_deineAnwendung

LG
Andy
 
Wie es aussieht hab ich wohl irgendwo einen Fehler gemacht.
Also ich bin wie folgt vorgegangen:

1.)
Ich habe folgendes Skript programm unter /etc/init.d/programm abgespeichert:
C:
 cat > /etc/init.d/programm << "EOF"
#!/bin/sh

echo "Starting programm..."
/home/serialport

exit 0
EOF
serialport ist mein C-File das ausgeführt werden soll.

dann hab ich 2.)
C:
chmod 755 /etc/init.d/programm
ausgeführt, weil
C:
chmod 755 /etc/init.d/S12_programm
gibt es ja nicht.
Danach hab ich 3.)
C:
ln -s /etc/init.d/programm /etc/rc.d/S12_programm
gemacht, aber nach dem Systemstart hat sich mein Board trotzdem mit root@netx> gemeldet.
Und beim Systemstart kam folgende Fehlermeldung:
C:
Starting INETD server: inetd ...DONE
run-parts: failed to exec /etc/rc.d/S12_programm: Exec format error
run-parts: /etc/rc.d/S12_programm exited with return code 1: Exec format error
xorg:  starting

login[792]: root login  on `ttyNX0'

root@netx:~>

Eine Idee was ich falsch gemacht habe.
Vielleicht hat es ja etwas damit zu tun, das ich einen autologin programmiert habe damit ich kein login udn kein passwort mehr eingeben muss, da nachher ein Gerät an meinem Board angeschlossen wird, welches sich nicht von selber anmelden kann.
Dazu hatte ich in etc/inittab etwas verändert udn ein script unter /bin/mylogin gespeichtert.
Kann es etwas mit dem zu tun haben, oder wo liegt bei mir der Fehler?

LG
Oli
 
Wie ich gerade gelesen habe, gibt es da ein generelles Problem mit run-parts, das das Script ausführen soll. Kannst Du das Script selbst ausführen ?

Code:
/etc/init.d/programm

oder kommt da evtl. eine Fehlermeldung ?
 
Also wenn ich das eingebe kommt folgene Meldung
C:
root@netx:~> /etc/init.d/programm
Starting programm...
/etc/init.d/programm: exec: 12: home/serialport: not found

aber mein serialport file liegt unter home
 
So jetzt bin ich ein Schritt weiter.
Jetzt hab ich serialport unter /bin gespeichert und mein script natürlich von home/serilaport auf serialport geändert, wenn ich jetzt
C:
/etc/init.d/programm
eingebe startet mein programm.
Aber beim Systemstart kommt trotzdem noch der gleiche Fehler wie vorher.
 
Zuletzt bearbeitet:
Zurück