1Danke
ERLEDIGT
JA
JA
ANTWORTEN
11
11
ZUGRIFFE
1348
1348
EMPFEHLEN
-
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:
Dieses Script wird zuletzt im jeweiligen Runlevel des Systems beim starten ausgeführt.Code :1 2 3
#!/bin/sh exec /pfad/anwendung &
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
AndyGeändert von andy72 (26.07.07 um 11:51 Uhr)
-
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.
Code c:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
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 :1 2 3 4 5 6 7 8
cat > /etc/init.d/deineAnwendung << "EOF" #!/bin/sh echo "Starting DEINE_ANWENDUNG..." /pfad/anwendung exit 0 EOF
dann noch
das macht das Script ausführbar und sollte dann beim nächsten Start mit geladen werden,nachdem Du das verlinkt hast:Code :1
chmod 755 /etc/init.d/S12_DeineAnwendung
Code :1
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:
serialport ist mein C-File das ausgeführt werden soll.Code c:1 2 3 4 5 6 7 8
cat > /etc/init.d/programm << "EOF" #!/bin/sh echo "Starting programm..." /home/serialport exit 0 EOF
dann hab ich 2.)
ausgeführt, weilCode c:1
chmod 755 /etc/init.d/programm
gibt es ja nicht.Code c:1
chmod 755 /etc/init.d/S12_programm
Danach hab ich 3.)
gemacht, aber nach dem Systemstart hat sich mein Board trotzdem mit root@netx> gemeldet.Code c:1
ln -s /etc/init.d/programm /etc/rc.d/S12_programm
Und beim Systemstart kam folgende Fehlermeldung:
Code c:1 2 3 4 5 6 7 8
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 :1
/etc/init.d/programm
oder kommt da evtl. eine Fehlermeldung ?
-
Also wenn ich das eingebe kommt folgene Meldung
Code c:1 2 3
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
eingebe startet mein programm.Code c:1
/etc/init.d/programm
Aber beim Systemstart kommt trotzdem noch der gleiche Fehler wie vorher.Geändert von Huemler (26.07.07 um 16:11 Uhr)
-
Jetzt funktioniert es.
Vielen vielen Dank.
Ich hab im Script die Zeile
weggelassen und hab außerCode c:1
cat > /etc/init.d/programm << "EOF"
und jetzt geht es.Code c:1 2 3 4 5 6 7
chmod 755 /etc/init.d/programm auch noch chmod 755 /etc/rc.d/S12_programm gemacht
Aber eine Frage hätte ich noch.
Es ist jetzt so, dass mein Programm gestartet wird und man dann mit ihm arbeiten kann usw... und wenn es geschlossen wird, geht es im Systemstart erst weiter mit
und dann bin ich eingeloggt alsCode c:1
login[794]: root login on `ttyNX0'
geht es vielleicht auch, dass erst der login vollzogen wird und danach sich mein programm startet?Code c:1
root@netx>
Was müsste ich dazu ändern, das erst login und dann mein Programm kommt?
Vielen Dank nochmal für deine Hilfe
Gruß
OliGeändert von Huemler (26.07.07 um 17:44 Uhr)
-
Sorry, ich hab mich evtl. blöd ausgedrückt:
die Zeile "cat > /etc/init.d/programm << EOF" sollte an der eingabeaufforderung eingegeben werden, dann hättest Du jeden Editor gespart, da cat > dateiname << "EOF" nichts weiter macht,als das STDIN in eine Datei zu leiten, bis EOF eingegeben wird.
Was ich auch vergessen habe, ist dein Programm zu backgrounden,das geht ganz einfach mit einem "&" (ohne Anführungszeichen) hinter dem Befehl im Script. Der Prozess wird damit in den Hintergrund gelegt. Eigentlich macht man das nicht, aber dein Programm scheint keinen Prozess (Thread) aufzubauen: guck Dir dazu mal fork() und/oder pthread() an, damit kannst Du das Programm ganz einfach "daemonisieren".
LG
Andy
Ähnliche Themen
-
Fehler beim Starten einer Anwendung über Java WebStart
Von clumsy im Forum JavaAntworten: 1Letzter Beitrag: 06.12.10, 13:30 -
Problem beim Starten meiner Anwendung
Von ceene im Forum Enterprise Java (JEE, J2EE, Spring & Co.)Antworten: 0Letzter Beitrag: 25.08.10, 09:20 -
Air/Flex-Anwendung aus einer anderen Air/Flex-Anwendung heraus starten
Von Julian Maicher im Forum Adobe Flex & AIRAntworten: 1Letzter Beitrag: 07.01.10, 15:01 -
[VS2005, c#, DataSet] DB wird gelöscht beim Starten der Anwendung. Warum?
Von Reticent im Forum .NET DatenverwaltungAntworten: 2Letzter Beitrag: 29.08.07, 15:58 -
Starten einer Anwendung
Von prexg im Forum C/C++Antworten: 3Letzter Beitrag: 29.08.03, 12:56





Zitieren
Login





