Programm sehr langsam nach autostart

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo,

    ich versuche schon seit Stunden ein mit C geschriebenes Programm per Autostart aus der Konsole zu starten. Ich habe in /etc/init.d ein Script erstellt und mittels update-rc.d eingestellt. Das Programm startet auch aber jedoch sehr langsam. Wenn ich es manuell, nach dem einloggen starte, funktioniert es einwandfrei ohne Verzögerungen.

    Was kann diese Lähmung versursachen??

    Wäre super wenn mir jemand Tipps geben könnte.

    Lg Manfred

  • Hi,

    leider nicht, ein sleep 20 z.B. hilft auch nichts, wahrsch. weil das Pi hier einfach 5Sek lang nichts tut, auch keine Programm weiter initilisiert etc.

    lg
    Manfred

    selbst wenn ich das Programm mittels cronjob erst nach ein paar minuten später starte geht das Programm nur sehr langsam :s

    Einmal editiert, zuletzt von Brunni82 (21. Dezember 2013 um 13:15)

  • Hast du die Abhängigkeiten richtig gesetzt unter "Required-Start".
    Wenn dein Programm von anderen zuvor initialisierten Modulen abgängig ist,
    und diese fehlen, kann es nicht richtig funktionieren.

    ### BEGIN INIT INFO
    # Provides: daemon-name
    # Required-Start: $network $remote_fs $syslog
    # Required-Stop: $network $remote_fs $syslog
    # Default-Start: 2 3 4 5
    # Default-Stop: 0 1 6
    # Short-Description:
    # Description:
    ### END INIT INFO

    "Ein jeder, weil er spicht, glaubt auch über die Sprache sprechen zu können."
    J.W. Goethe

  • Hallo,

    mhh das könnte durchaus sein. In meinem Programm werden unter anderem omxplaxer aufgerufen, Grafiken (Funktionen aus openvg) angezeigt, Timer ausgelesen, serielle Schnittstelle ausgelesen etc.

    Wie kann ich überprüfen welche Module bei manuell gestartetem Programm laufen bzw.benötigt wreden?


  • Wie kann ich überprüfen welche Module bei manuell gestartetem Programm laufen bzw.benötigt wreden?

    Siehe im Terminal auch die Ausgaben für:

    Code
    sudo lsof -c <Pfad/zu/deinem/C-Programm/C-Programm>


    und für

    Code
    ldd <Pfad/zu/deinem/C-Programm/C-Programm>

    Evtl. musst Du lsof noch installieren:

    Code
    sudo apt-get install lsof

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Meine PIs

    PI4B/8GB (border device) OpenBSD 7.4 (64bit): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server

    PI3B+ FreeBSD 14.0-R-p3 (arm64): SSH-Serv., WireGuard-Serv., ircd-hybrid-Serv., stunnel-Proxy, Mumble-Serv., ddclient

    PI4B/4GB Bullseye-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server, botamusique, ample

  • Abend!

    ok, hab das mit den zwei Befehlen mal probiert, mit folgendem Resultat:

    root@raspberrypi:/home/Manfred# lsof -c zenith.bin
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    zenith.bi 28089 root cwd DIR 179,2 4096 47466 /home/Manfred
    zenith.bi 28089 root rtd DIR 179,2 4096 2 /
    zenith.bi 28089 root txt REG 179,2 551972 49260 /home/Manfred/zenith.bin
    zenith.bi 28089 root mem REG 179,2 15400 15893 /usr/lib/arm-linux-gnuea bihf/libXdmcp.so.6.0.0
    zenith.bi 28089 root mem REG 179,2 7508 15887 /usr/lib/arm-linux-gnuea bihf/libXau.so.6.0.0
    zenith.bi 28089 root mem REG 179,2 91972 15899 /usr/lib/arm-linux-gnuea bihf/libxcb.so.1.1.0
    zenith.bi 28089 root mem REG 179,2 427628 4238 /lib/arm-linux-gnueabihf /libm-2.13.so
    zenith.bi 28089 root mem REG 179,2 9812 4236 /lib/arm-linux-gnueabihf /libdl-2.13.so
    zenith.bi 28089 root mem REG 179,2 131372 1253 /lib/arm-linux-gnueabihf /libgcc_s.so.1
    zenith.bi 28089 root mem REG 179,2 1196144 4230 /lib/arm-linux-gnueabihf /libc-2.13.so
    zenith.bi 28089 root mem REG 179,2 1096232 15927 /usr/lib/arm-linux-gnuea bihf/libX11.so.6.3.0
    zenith.bi 28089 root mem REG 179,2 121388 47949 /usr/lib/arm-linux-gnuea bihf/libjpeg.so.62.0.0
    zenith.bi 28089 root mem REG 179,2 26632 4214 /lib/arm-linux-gnueabihf /librt-2.13.so
    zenith.bi 28089 root mem REG 179,2 116462 4223 /lib/arm-linux-gnueabihf /libpthread-2.13.so
    zenith.bi 28089 root mem REG 179,2 43144 47932 /usr/local/lib/libwiring Pi.so.2.0
    zenith.bi 28089 root mem REG 179,2 29707 128785 /opt/vc/lib/libvchiq_arm .so
    zenith.bi 28089 root mem REG 179,2 177322 128779 /opt/vc/lib/libvcos.so
    zenith.bi 28089 root mem REG 179,2 77192 128789 /opt/vc/lib/libbcm_host. so
    zenith.bi 28089 root mem REG 179,2 31207 128783 /opt/vc/lib/libopenmaxil .so
    zenith.bi 28089 root mem REG 179,2 204116 128787 /opt/vc/lib/libEGL.so
    zenith.bi 28089 root mem REG 179,2 105023 128778 /opt/vc/lib/libGLESv2.so
    zenith.bi 28089 root mem REG 179,2 87792 5175 /lib/arm-linux-gnueabihf /libz.so.1.2.7
    zenith.bi 28089 root mem REG 179,2 498024 24381 /usr/lib/arm-linux-gnuea bihf/libfreetype.so.6.8.1
    zenith.bi 28089 root mem REG 179,2 10170 24733 /usr/lib/arm-linux-gnuea bihf/libcofi_rpi.so
    zenith.bi 28089 root mem REG 179,2 126236 4224 /lib/arm-linux-gnueabihf /ld-2.13.so
    zenith.bi 28089 root 0u CHR 136,0 0t0 3 /dev/pts/0
    zenith.bi 28089 root 1u CHR 136,0 0t0 3 /dev/pts/0
    zenith.bi 28089 root 2u CHR 136,0 0t0 3 /dev/pts/0
    zenith.bi 28089 root 3u CHR 250,0 0t0 198 /dev/vchiq
    zenith.bi 28089 root 4u REG 0,14 4096 7270 /sys/devices/virtual/gpi o/gpio7/value
    zenith.bi 28089 root 5u REG 0,14 4096 7261 /sys/devices/virtual/gpi o/gpio8/value
    zenith.bi 28089 root 6u REG 0,14 4096 7279 /sys/devices/virtual/gpi o/gpio9/value
    zenith.bi 28089 root 7u REG 0,14 4096 7234 /sys/devices/virtual/gpi o/gpio22/value
    zenith.bi 28089 root 8u REG 0,14 4096 7252 /sys/devices/virtual/gpi o/gpio23/value
    zenith.bi 28089 root 9u REG 0,14 4096 7288 /sys/devices/virtual/gpi o/gpio24/value
    zenith.bi 28089 root 10u REG 0,14 4096 7243 /sys/devices/virtual/gpi o/gpio25/value
    zenith.bi 28089 root 11r CHR 204,64 0t0 8 /dev/ttyAMA0
    zenith.bi 28089 root 12u CHR 89,1 0t0 1596 /dev/i2c-1
    zenith.bi 28089 root 13u REG 0,14 4096 7252 /sys/devices/virtual/gpi o/gpio23/value
    zenith.bi 28089 root 14u REG 0,14 4096 7243 /sys/devices/virtual/gpi o/gpio25/value
    root@raspberrypi:/home/Manfred# ldd zenith.bin
    /usr/lib/arm-linux-gnueabihf/libcofi_rpi.so (0xb6fd1000)
    libfreetype.so.6 => /usr/lib/arm-linux-gnueabihf/libfreetype.so.6 (0xb6f44000)
    libz.so.1 => /lib/arm-linux-gnueabihf/libz.so.1 (0xb6f26000)
    libGLESv2.so => /opt/vc/lib/libGLESv2.so (0xb6f09000)
    libEGL.so => /opt/vc/lib/libEGL.so (0xb6ed7000)
    libopenmaxil.so => /opt/vc/lib/libopenmaxil.so (0xb6ec9000)
    libbcm_host.so => /opt/vc/lib/libbcm_host.so (0xb6eaf000)
    libvcos.so => /opt/vc/lib/libvcos.so (0xb6e9d000)
    libvchiq_arm.so => /opt/vc/lib/libvchiq_arm.so (0xb6e8f000)
    libwiringPi.so => /usr/local/lib/libwiringPi.so (0xb6e7d000)
    libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0xb6e5d000)
    librt.so.1 => /lib/arm-linux-gnueabihf/librt.so.1 (0xb6e4e000)
    libjpeg.so.62 => /usr/lib/arm-linux-gnueabihf/libjpeg.so.62 (0xb6e28000)
    libX11.so.6 => /usr/lib/arm-linux-gnueabihf/libX11.so.6 (0xb6d14000)
    libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6be5000)
    /lib/ld-linux-armhf.so.3 (0xb6fde000)
    libgcc_s.so.1 => /lib/arm-linux-gnueabihf/libgcc_s.so.1 (0xb6bbd000)
    libdl.so.2 => /lib/arm-linux-gnueabihf/libdl.so.2 (0xb6bb1000)
    libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0xb6b40000)
    libxcb.so.1 => /usr/lib/arm-linux-gnueabihf/libxcb.so.1 (0xb6b21000)
    libXau.so.6 => /usr/lib/arm-linux-gnueabihf/libXau.so.6 (0xb6b17000)
    libXdmcp.so.6 => /usr/lib/arm-linux-gnueabihf/libXdmcp.so.6 (0xb6b0a000)

    :s

    Nur was genau soll ich nun alles als Required-Start Bedingung reinschreiben?

    Wäre cool wenn du mir da weiterhelfen kannst.

    Lg Manfred


  • ... Required-Start Bedingung reinschreiben?

    Versuch mal, erst im runlevel 5 das Programm zu starten.

    The most popular websites without IPv6 in Germany.  IPv6-Ausreden

    Meine PIs

    PI4B/8GB (border device) OpenBSD 7.4 (64bit): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server

    PI3B+ FreeBSD 14.0-R-p3 (arm64): SSH-Serv., WireGuard-Serv., ircd-hybrid-Serv., stunnel-Proxy, Mumble-Serv., ddclient

    PI4B/4GB Bullseye-lite (64bit; modifiziert): SSH-Server, WireGuard-Server, ircd-hybrid-Server, stunnel-Proxy, Mumble-Server, botamusique, ample

  • Runlevel 2,3,4,5 sollen schon gesetzt werden.
    RBPi läuft standardmässig in Runlevel 2. Das kannst du auch mit dem Befehl runlevel überprüfen.

    Wie sieht den das /etc/init.d Skript aus mit dem dieser daemon gestartet wird?

    "Ein jeder, weil er spicht, glaubt auch über die Sprache sprechen zu können."
    J.W. Goethe

    Einmal editiert, zuletzt von alexwatermann (21. Dezember 2013 um 22:10)

  • HI, mein Startskript schaut wie folgt aus:

    # #! /bin/sh
    # /etc/init.d/mediascreen

    ### BEGIN INIT INFO
    # Provides: mediascreen
    # Required-Start: $network $remote_fs $syslog
    # Required-Stop: $remote_fs $syslog
    # Default-Start: 2 3 4 5
    # Default-Stop: 0 1 6
    # Short-Description: Simple script to start a program at boot
    # Description: A simple script from http://www.stuffaboutcode.com which will start / stop a program a boot / shutdown.
    ### END INIT INFO

    # If you want a command to always run, put it here

    # Carry out specific functions when asked to by the system
    case "$1" in
    start)
    echo "Starting mediascreen"
    # run application you want to start
    sudo /home/Manfred/zenith.bin
    ;;
    stop)
    echo "Stopping mediascreen"
    # kill application you want to stop
    killall zenith.bin
    ;;
    *)
    echo "Usage: /etc/init.d/mediascreen {start|stop}"
    exit 1
    ;;
    esac

    exit 0

    was ich noch vll. dazuschreiben hätte sollen, der ganze Pi läuft nach dem automatischen Programmstart extrem langsam, Zugriff übers Netzwerk auf Dateien dauert ewig, auch reagiert das Ding nicht mehr auf Tastatureingaben z.B. Strg+C

    Einmal editiert, zuletzt von Brunni82 (21. Dezember 2013 um 22:53)

  • daemonisiert sich dein Programm selbst? Erstellt es auch die Prozess ID?
    Wie ist der Status im htop nachdem das Programm über das Skript ausgeführt wird?
    Wahrscheinlich läuft es als Kind-Prozess der Shell.
    Initializiere und beende das Programm im Init-Skript mit daemon-start-stop Befehl.
    Schaue dir auch mal die Datei /etc/init.d/skeleton an.

    "Ein jeder, weil er spicht, glaubt auch über die Sprache sprechen zu können."
    J.W. Goethe

  • ja, eine PID hat mein Programm.

    Das Skeleton Beispiel muss ich mir genauer ansehen, check das nicht ganz. Den Pfad und den Namen den man angeben soll, Name = mein programm.bin und ins /usr/sbin kopieren???? sorry, da bin ich momentan als linux newbie überfordert :(

  • Hallo,

    habe nun festgestellt, wenn ich mein Startskript aktiviere und den PI reboote das Programm auch mit normaler Geschwindigkeit startet, es kommen vorher jedoch Fehler bezgl. GPIO: not found. Nach ein paar Sekunden geht das Programm normal weiter und läuft wie es soll.

    Wenn ich den PI aber abschalte und neu hochfahren lassen, lahmt es wieder. Wie gesgat es lahmt auch , wenn ich mein Programm erst nach 1min. mittels cronjob starte nachdem ja schon alles initialisiert sein müsste.:helpnew:

    komisch, nichts geändert, Pi eingeschalten, Programm startet, GPIO:not found kommt ein paar Mal jedoch dann läuft das Programm schön flott wie es sein soll ABER PI reagiert weder auf Tastatur noch hab ich per Netzwerk Zugriff drauf :-/

    Einmal editiert, zuletzt von Brunni82 (22. Dezember 2013 um 19:19)

  • Hallo zusammen,

    wie ich das auf die Schnelle sehe, hat Dein Programm in "init" eigentlich nichts verloren.
    Trage es einfach mal in "/etc/rc.local" ein, am Ende des Skriptaufrufs aber noch ein &-Zeichen anhängen. Sollte dann etwa so aussehen:

    Code
    DeinScriptName &
    exit

    Dein Start-Stop Script musst Du dann auch löschen.

    Gruß, mmi

  • Hallo,

    ich habe jetzt mal versucht verschiedene Codesegemnte auszuklammern um zu überprüfen, ob irgendwelche Initialisierungen in meinem Code die Lähmung verursacht mit dem Ergebins das diese Funktionen mein Programm wenn ich es per Autostart öffne, lähmen:

    if (wiringPiISR (23, INT_EDGE_FALLING, &PortExpanderIO) < 0)
    {
    fprintf (stderr, "Unable to setup ISR: %s\n", strerror (errno)) ;
    return 1 ;
    }
         
         
    if (wiringPiISR (25, INT_EDGE_FALLING, &checkgrinderstate) < 0)
    {
    fprintf (stderr, "Unable to setup ISR: %s\n", strerror (errno)) ;
    return 1 ;
    }


    was genau kann die Ursache sein? Irgendwas noch nicht vom PI aus initialisiert zu dem Zeitpunkt des Aufrufes? Wie gesgat, wenn ich es per Hand starte, eingeloggt als User Pi und gestartet mit sudo vor dem Programmname geht alles wunderbar.

    Gruß, Manfred

  • Versuche in der Datei wiringPiISR.c in der for(;; ) Schleife eine Pause zu setzen.

    static void *interruptHandler (void *arg)
    {
    int pin = *(int *)arg ;

    (void)piHiPri (55) ;

    for (;; )
    {
    if (waitForInterrupt (pin, -1) > 0)
    isrFunctions [pin] () ;
        sleep(500);
    }

    return NULL ;
    }


    Sonst läuft die Schleife ununterbrochen bis ein Interrupt autritt und blockiert dabei die anderen Prozesse.
    Mit der Pause gibst du die Chance den andern Programmen ihre Initialisierung abzuarbeiten.

    "Ein jeder, weil er spicht, glaubt auch über die Sprache sprechen zu können."
    J.W. Goethe

  • hi,
    das Einfügen von sleep hat schon mal dazu geführt, dass mein Programm verzögerungsfrei startet. Jedoch regiert der PI nach dem ersten Tastendruck (die ISR checkt bei mir ob über den I2C Portexpander eine Veränderung erfolgte) nicht mehr. Alles andere Funktioniert (UART, Grafikausgabe etc.) Danach habe ich sleep von 500ms auf 10ms reduziert, die Tasten werden wieder erkannt also keine Interrupts verschlafen jedoch wenn ich den PI komplett auschalte und dann neu starten lasse bricht das Programm nach dem Start (beim Init der ISR) ab. Bei einem sleep von 100ms jedoch nicht, startet normal ohne Lähmung, aber dann verschäft das Ding wieder sämtliche Int. von der Tastatur bzw. vom I2C Port-Expander- Interrupt Pin.

    Auch das USB Keyboard reagiert nicht also Abbrechen mit Strg+C ist nicht möglich. Hab auch mal die Prioritäten (standard 55) verändert, aber dann bricht das Programm auch ab.

    Gruß, Manfred

  • Moin ;) ...

    hast Du schon in Erwägung gezogen, mal eine andere API zu nutzen?
    Wenn ja, dann kann ich Dir pigpio wärmstens empfehlen.
    Mit dieser Library hatte ich, im Gegensatz zu wiringPi und bcm2835, noch nie Probleme.

    cheers und lass Dir was Hübsches schenken,
    -ds-

  • Die Sleep() - Prozedur darf natürlich nicht zu lang sein. In meinem Beispiel habe ich sie auf 500 Sekunden,
    was natürlich Quatsch ist. Setze sie auf:

    usleep(100000);

    Es sind 100 ms. Der Header für usleep() ist unistd.h.

    "Ein jeder, weil er spicht, glaubt auch über die Sprache sprechen zu können."
    J.W. Goethe

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!