Eigenes Projekt im System (service) verfügbar machen?

  • Hallo alle miteinander,

    ich hoffe erstmal, dass ich mit meiner Frage in diesem Unterordner richtig bin.

    Zurzeit entwickel ich ein C-Programm für den Raspberry Pi mit Jessie als OS. Das Programm wird mittels Cross-Compile auf den Raspberry geladen und dadurch bekomme ich dann eine ausführbare .out Datei. Meine Frage ist jetzt, wie ich mein Programm systemweit verfügbar machen kann wie es z.B. bei apache der Fall ist???

    Bisher habe ich ein Skript in /etc/init.d erstellt, allerdings funktioniert das nicht so wirklich...

    Spoiler anzeigen

    #!/bin/sh

    ### BEGIN INIT INFO

    # Provides: can_converter

    # Required-Start: $local_fs $network $named $time $syslog

    # Required-Stop: $local_fs $network $named $time $syslog

    # Default-Start: 2 3 4 5

    # Default-Stop: 0 1 6

    # Description: Convert network packets into lin and can

    ### END INIT INFO

    SCRIPT="./home/pi/projects/can_converter/bin/ARM/Debug/can_converter.out -u 60000 -t 60000 -s 60005 -d 60001 -f -v"

    RUNAS=pi

    PIDFILE=/var/run/can_converter.pid

    LOGFILE=/var/log/can_converter.log

    start() {

    if [ -f $PIDFILE ] && [ -s $PIDFILE ] && kill -0 $(cat $PIDFILE); then

    echo 'Service already running' >&2

    return 1

    fi

    echo 'Starting service…' >&2

    local CMD="$SCRIPT > \"$LOGFILE\" & echo \$!"

    sudo "$CMD" > "$PIDFILE"

    # Try with this command line instead of above if not workable

    # su -s /bin/sh $RUNAS -c "$CMD" > "$PIDFILE"

    sleep 2

    PID=$(cat $PIDFILE)

    if pgrep -u $RUNAS -f $NAME > /dev/null

    then

    echo "$NAME is now running, the PID is $PID"

    else

    echo ''

    echo "Error! Could not start $NAME!"

    fi

    }

    stop() {

    if [ ! -f "$PIDFILE" ] || ! kill -0 $(cat "$PIDFILE"); then

    echo 'Service not running' >&2

    return 1

    fi

    echo 'Stopping service…' >&2

    kill -15 $(cat "$PIDFILE") && rm -f "$PIDFILE"

    echo 'Service stopped' >&2

    }

    uninstall() {

    echo -n "Are you really sure you want to uninstall this service? That cannot be undone. [yes|No] "

    local SURE

    read SURE

    if [ "$SURE" = "yes" ]; then

    stop

    rm -f "$PIDFILE"

    echo "Notice: log file was not removed: $LOGFILE" >&2

    update-rc.d -f $NAME remove

    rm -fv "$0"

    fi

    }

    status() {

    printf "%-50s" "Checking <NAME>..."

    if [ -f $PIDFILE ] && [ -s $PIDFILE ]; then

    PID=$(cat $PIDFILE)

    if [ -z "$(ps axf | grep ${PID} | grep -v grep)" ]; then

    printf "%s\n" "The process appears to be dead but pidfile still exists"

    else

    echo "Running, the PID is $PID"

    fi

    else

    printf "%s\n" "Service not running"

    fi

    }


    case "$1" in

    start)

    start

    ;;

    stop)

    stop

    ;;

    status)

    status

    ;;

    uninstall)

    uninstall

    ;;

    restart)

    stop

    start

    ;;

    *)

    echo "Usage: $0 {start|stop|status|restart|uninstall}"

    esac

    Ich habe dafür das Besipiel hier verwendet und ein wenig angepasst.

    Kann es vielleicht sein, dass ich aus meinem Programm noch ein Daemon oder so machen muss???

    Es wäre echt super wenn mir einer helfen könnte!

    MfG

  • Eigenes Projekt im System (service) verfügbar machen?? Schau mal ob du hier fündig wirst!

  • Bisher habe ich ein Skript in /etc/init.d erstellt, allerdings funktioniert das nicht so wirklich...

    Wie sind die Ausgaben von:

    Code
    file /home/pi/projects/can_converter/bin/ARM/Debug/can_converter.out
    ldd /home/pi/projects/can_converter/bin/ARM/Debug/can_converter.out

    ?

    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-p6 (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

  • Code
    file /home/pi/projects/can_converter/bin/ARM/Debug/can_converter.out
    
    /home/pi/projects/can_converter/bin/ARM/Debug/can_converter.out: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.6.32, BuildID[sha1]=b8801af334a7b946b3a0605e0041f392fe0b49e3, not stripped
  • Bisher habe ich ein Skript in /etc/init.d erstellt, allerdings funktioniert das nicht so wirklich...

    Mit z. B.:

    Code
    sudo sh -x /etc/init.d/<dein-Start-Stop-Script>

    (ohne spitze Klammern und mit dem richtigen Namen), kannst Du sehen wie dein Script zeilenweise ausgeführt (... oder nicht (komplett) ausgeführt) wird.

    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-p6 (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

  • Ich habe noch nicht ganz verstanden, was Du eigentlich erreichen willst. Du schreibst "systemweit verfügbar machen", Dein Post klingt aber eher so, als meintest Du "automatisch bei jedem Systemstart starten".

    Falls tatsächlich letzteres gemeint ist: Der zukunftsträchtigere Weg ist über eine systemd service unit, nicht über ein BSD-init-Skript.

    Ansonsten ist in Deinem Skript der "." am Anfang von SCRIPT falsch.

  • Der zukunftsträchtigere Weg ist über eine systemd service unit, nicht über ein BSD-init-Skript.

    BTW: Ja, aber es ist ja nicht falsch wenn man mal ein _funktionierendes_ BSD-init-Script hat, dem systemd-sysv-generator über die Schulter zu schauen. Mit den Infos kann man dann seine eigene systemd service unit erstellen.

    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-p6 (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

  • Vielen Dank für eure Hilfe!

    Ich habe es jetzt auch hinbekommen. Habe jetzt zum größte Teil das Besipiel hier verwendet...

    Spoiler anzeigen

    #!/bin/sh

    # kFreeBSD do not accept scripts as interpreters, using #!/bin/sh and sourcing.

    if [ true != "$INIT_D_SCRIPT_SOURCED" ] ; then

    set "$0" "$@"; INIT_D_SCRIPT_SOURCED=true . /lib/init/init-d-script

    fi

    ### BEGIN INIT INFO

    # Provides: can_converter

    # Required-Start: $local_fs $network $named $time $syslog

    # Required-Stop: $local_fs $network $named $time $syslog

    # Default-Start: 2 3 4 5

    # Default-Stop: 0 1 6

    # Short-Description: Service file for can_converter

    ### END INIT INFO

    DAEMON_PATH="/home/pi/projects/can_converter/bin/ARM/Debug/"

    DAEMON=./can_converter.out

    DAEMONOPTS="-u 60000 -t 60000 -s 60005 -d 60001 -b 10.19.11.107 -f -v"

    NAME=can_converter

    DESC="Converts network packets into lin or can frames."

    PIDFILE=/var/run/$NAME.pid

    SCRIPTNAME=/etc/init.d/$NAME

    start() {

    echo "Starting $NAME..."

    cd $DAEMON_PATH

    PID=`sudo $DAEMON $DAEMONOPTS > /dev/null 2>&1 & echo $!`

    #echo "Saving PID" $PID " to " $PIDFILE

    if [ -z $PID ]; then

    echo "Fail"

    else

    echo $PID > $PIDFILE

    echo "Ok"

    fi

    }

    stop() {

    echo "Stopping $NAME..."

    PID=`cat $PIDFILE`

    cd $DAEMON_PATH

    if [ -f $PIDFILE ]; then

    killall -2 $NAME.out

    echo "Ok"

    rm -f $PIDFILE

    else

    echo "pidfile not found"

    fi

    }

    uninstall() {

    echo -n "Are you really sure you want to uninstall this service? That cannot be undone. [yes|No] "

    local SURE

    read SURE

    if [ "$SURE" = "yes" ]; then

    stop

    rm -f "$PIDFILE"

    echo "Notice: log file was not removed: $LOGFILE" >&2

    update-rc.d -f $NAME remove

    rm -fv "$0"

    fi

    }

    status() {

    echo "Checking $NAME..."

    if [ -f $PIDFILE ]; then

    PID=`cat $PIDFILE`

    if [ -z "`ps axf | grep ${PID} | grep -v grep`" ]; then

    echo "Process dead but pidfile exists"

    else

    echo "Running"

    fi

    else

    echo "Service not running"

    fi

    }


    case "$1" in

    start)

    start

    ;;

    stop)

    stop

    ;;

    status)

    status

    ;;

    uninstall)

    uninstall

    ;;

    restart)

    stop

    start

    ;;

    *)

    echo "Usage: $0 {start|stop|status|restart|uninstall}"

    esac

  • Ich habe es jetzt auch hinbekommen.

    Versuch mal ohne sudo, in deinem Start-Stop-Script, denn dieses wird ja schon mit root-Rechten ausgeführt.

    BTW: Dein binary kannst auch noch strippen, dann ist es kleiner.

    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-p6 (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

Jetzt mitmachen!

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