Start-Stop-Status Script mit dynamischem Pfad (command -v), Problem

Status
Für weitere Antworten geschlossen.

Dirk070

Benutzer
Mitglied seit
02. Jan 2018
Beiträge
12
Punkte für Reaktionen
0
Punkte
1
Hallo zusammen,

ich habe seit einigen Jahren eine DS 212+ im Einsatz gehabt und nun auf eine 918+ gewechselt.
Einer der Gründe war, für FHEM das Active Perl nutzen zu können.

Auf der 918+ ist also nun Active Perl installiert und FHEM läuft problemlos.
Nun wollte ich das Start-Script so ändern, dass ich es nicht manuell ändern muss, wenn ich mal eine neue Version von Active Perl installieren.
Dadurch könnte sich das Installationsverzeichnis ändern, also möchte ich dynamisch das Verzeichnis ermitteln, in dem Perl installiert ist.

....ich könnte auch Perl in einem Verzeichnis ohne Versionsnummer installieren und eine neue Version einfach drüber installieren.
Der andere Weg sollte aber auch funktionieren, wenn ich nach 3 Jahren nicht mehr weiss, was ich da angestellt habe :)

Gut, ich habe also das Start-Script angepasst und den Pfad so gesetzt: perl_BIN=$(command -v perl)
Hier das komplett Script:

Rich (BBCode):
#!/bin/sh
exec 2>> /volume1/@appstore/fhem/bin/err_fhem.log
#
#
HOME=/usr/local/fhem/opt
PATH=$HOME:$PATH
export PATH
cd ${HOME}

# Befehl Which Perl eingefuegt
fhem_BIN=${HOME}/fhem.pl
perl_BIN=$(command -v perl)
#perl_BIN=$(type perl)
#perl_BIN=/opt/ActivePerl-5.24/bin/perl

test -x ${fhem_BIN} || { echo "${fhem_BIN} not installed";
    if [ "$1" = "stop" ]; then exit 0;
    else exit 5; fi; }

# Check for existence of needed config file and read it
fhem_CONFIG=${HOME}/fhem.cfg
test -r ${fhem_CONFIG} || { echo "${fhem_CONFIG} not existing";
    if [ "$1" = "stop" ]; then exit 0;
    else exit 6; fi; }

fhem_LOG=${HOME}/log/fhem-`date +"%Y-%m"`.log

#
case "$1" in
    start)
        echo "Starting fhem DS "
# Aufruf geaendert
        $perl_BIN $fhem_BIN $fhem_CONFIG
        ;;
    stop)
        echo "Shutting down fhem DS "
# Aufruf geaendert
        $perl_BIN $fhem_BIN 7072 shutdown
        ;;
    restart)
        $0 stop
        $0 start
        ;;
    status)
        echo -n "Checking for service fhem "
        ps|grep fhem.pl
        ;;
    log)
        test -r $fhem_LOG || { echo "$fhem_LOG not existing"; exit 0; }
        echo $fhem_LOG
        ;;
    *)
        echo "Usage: $0 {start|stop|status|restart|log}"
        exit 1
        ;;
esac
exit 0

Über das Terminal und mit ./fhem.sh funktioniuert das Script, alles bestens.
Wie man sieht habe ich die Fehlermeldungen in eine Datei umgeleitet, um eine Art debugging zu ermöglichen.

Starte und Stoppe ich über das Paketzentrum (also das Start-Stop-Status Script der Syno), funktiniert das fhem.sh nicht.
Folgenden Fehlermeldungen werden in die Error-Datei geschrieben (erste Zeile Stop, 2. Zeile Start):
Rich (BBCode):
/usr/local/fhem/bin/fhem.sh: /usr/local/fhem/opt/fhem.pl: /usr/bin/perl: bad interpreter: No such file or directory
/usr/local/fhem/bin/fhem.sh: /usr/local/fhem/opt/fhem.pl: /usr/bin/perl: bad interpreter: No such file or directory

Ich habe auch schon 2 Test-Scripts angelegt, so dass eines das andere aufruft. Aber auch das funktiniert über das Terminal.
Setze ich den Pfad mit einer direkten Zuweisung (ist auskommentiert im Script) dann klappt es auch über das Paketzentrum.
Ich bin mit meinem Latein am Ende, kann mir hier jemand helfen?

Vielen Dank vorab für Eure Hilfe und schöne Grüße,
Dirk
 

hvkls

Benutzer
Mitglied seit
23. Dez 2012
Beiträge
463
Punkte für Reaktionen
0
Punkte
22
Probier statt "command -v perl" mal

perl_BIN=$( /usr/bin/env perl )

oder

perl_BIN=$( /usr/bin/which perl )
 

Dirk070

Benutzer
Mitglied seit
02. Jan 2018
Beiträge
12
Punkte für Reaktionen
0
Punkte
1
Hallo und Danke für die Hilfe.

Leider liefern die Befehle den selben Fehler:
Rich (BBCode):
/usr/local/fhem/bin/fhem.sh: /usr/local/fhem/opt/fhem.pl: /usr/bin/perl: bad interpreter: No such file or directory

Ich habe den Verdacht, dass die Befehle über das Paketzentrum anders (Berechtigungen, User, ...) ausgeführt werden, als über die Console.

Schöne Grüße,
Dirk
 

hvkls

Benutzer
Mitglied seit
23. Dez 2012
Beiträge
463
Punkte für Reaktionen
0
Punkte
22
Dann änder doch mal den Anfang von /usr/local/fhem/opt/fhem.pl von
#!/usr/bin/perl
in
#!/usr/bin/env perl
 

Benares

Benutzer
Sehr erfahren
Mitglied seit
27. Sep 2008
Beiträge
13.726
Punkte für Reaktionen
3.714
Punkte
468
Wenn so ein Script interaktiv funktioniert, im Startbetrieb beim Booten aber nicht, liegt das zu 99% an fehlenden Einträgen in $PATH.
Also besser immer alle benötigten $PATH-Bestandteile mit in Script übernehmen oder einfach alles, was "echo $PATH" im interaktiven Mode ausgibt.

Edit: Auch "which" funktioniert nur, wenn das Kommando über den Pfad gefunden wird.
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat