tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von andy72
ERLEDIGT
JA
ANTWORTEN
11
ZUGRIFFE
1348
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Huemler Huemler ist offline Mitglied Bronze
    Registriert seit
    May 2007
    Beiträge
    25
    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
     

  2. #2
    andy72 andy72 ist offline Mitglied Platin
    Registriert seit
    Oct 2006
    Ort
    München
    Beiträge
    655
    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 :
    1
    2
    3
    
    #!/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
    Geändert von andy72 (26.07.07 um 11:51 Uhr)
    Dr Dau bedankt sich. 

  3. #3
    Huemler Huemler ist offline Mitglied Bronze
    Registriert seit
    May 2007
    Beiträge
    25
    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
     

  4. #4
    andy72 andy72 ist offline Mitglied Platin
    Registriert seit
    Oct 2006
    Ort
    München
    Beiträge
    655
    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
     

  5. #5
    Huemler Huemler ist offline Mitglied Bronze
    Registriert seit
    May 2007
    Beiträge
    25
    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
     

  6. #6
    andy72 andy72 ist offline Mitglied Platin
    Registriert seit
    Oct 2006
    Ort
    München
    Beiträge
    655
    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
    Code :
    1
    
    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 :
    1
    
    ln -s /etc/init.d/deineAnwendung /etc/rc.d/S12_deineAnwendung

    LG
    Andy
     

  7. #7
    Huemler Huemler ist offline Mitglied Bronze
    Registriert seit
    May 2007
    Beiträge
    25
    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:
    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
    serialport ist mein C-File das ausgeführt werden soll.

    dann hab ich 2.)
    Code c:
    1
    
    chmod 755 /etc/init.d/programm
    ausgeführt, weil
    Code c:
    1
    
    chmod 755 /etc/init.d/S12_programm
    gibt es ja nicht.
    Danach hab ich 3.)
    Code c:
    1
    
    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:
    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
     

  8. #8
    andy72 andy72 ist offline Mitglied Platin
    Registriert seit
    Oct 2006
    Ort
    München
    Beiträge
    655
    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 ?
     

  9. #9
    Huemler Huemler ist offline Mitglied Bronze
    Registriert seit
    May 2007
    Beiträge
    25
    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
     

  10. #10
    Huemler Huemler ist offline Mitglied Bronze
    Registriert seit
    May 2007
    Beiträge
    25
    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
    Code c:
    1
    
    /etc/init.d/programm
    eingebe startet mein programm.
    Aber beim Systemstart kommt trotzdem noch der gleiche Fehler wie vorher.
    Geändert von Huemler (26.07.07 um 16:11 Uhr)
     

  11. #11
    Huemler Huemler ist offline Mitglied Bronze
    Registriert seit
    May 2007
    Beiträge
    25
    Jetzt funktioniert es.
    Vielen vielen Dank.

    Ich hab im Script die Zeile
    Code c:
    1
    
    cat > /etc/init.d/programm << "EOF"
    weggelassen und hab außer
    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
    und jetzt geht es.

    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
    Code c:
    1
    
    login[794]: root login  on `ttyNX0'
    und dann bin ich eingeloggt als
    Code c:
    1
    
    root@netx>
    geht es vielleicht auch, dass erst der login vollzogen wird und danach sich mein programm startet?
    Was müsste ich dazu ändern, das erst login und dann mein Programm kommt?

    Vielen Dank nochmal für deine Hilfe

    Gruß
    Oli
    Geändert von Huemler (26.07.07 um 17:44 Uhr)
     

  12. #12
    andy72 andy72 ist offline Mitglied Platin
    Registriert seit
    Oct 2006
    Ort
    München
    Beiträge
    655
    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

  1. Antworten: 1
    Letzter Beitrag: 06.12.10, 13:30
  2. Problem beim Starten meiner Anwendung
    Von ceene im Forum Enterprise Java (JEE, J2EE, Spring & Co.)
    Antworten: 0
    Letzter Beitrag: 25.08.10, 09:20
  3. Air/Flex-Anwendung aus einer anderen Air/Flex-Anwendung heraus starten
    Von Julian Maicher im Forum Adobe Flex & AIR
    Antworten: 1
    Letzter Beitrag: 07.01.10, 15:01
  4. Antworten: 2
    Letzter Beitrag: 29.08.07, 15:58
  5. Starten einer Anwendung
    Von prexg im Forum C/C++
    Antworten: 3
    Letzter Beitrag: 29.08.03, 12:56