Jameica/Hibiscus Server Daemon

Init-Script um Jameica/Hibiscus als Daemon-Hintergrunddienst auf CentOS 6.x zu betreiben.

 
CBC
Benutzer
Avatar
Geschlecht:
Herkunft: Bonn
Homepage: viaembedded.com
Beiträge: 81
Dabei seit: 06 / 2015
Betreff:

Jameica/Hibiscus Server Daemon

 · 
Gepostet: 09.06.2015 - 13:07 Uhr  ·  #1
Erst mal ein freundliches 'Hallo!' in die Runde.


Ist mein erster Beitrag hier. Hatte bisher ab und an mal in diesem Forum gelesen und fand die Beiträge immer sehr hilfreich, daher möchte ich heute etwas zurückgeben:

Vor einiger Zeit habe ich unter Linux, genau genommen CentOS 6.6, einen Jameica/Hibiscus Server aufsetzen wollen, der automatisch alle Umsätze und Salden abholt und in einer MySQL Datenbank speichert. Das funktioniert ja quasi out-of-the-box ... allerdings fehlte mir noch ein Init-Script für CentOS, so dass die Jameica-Plattform direkt beim Booten als Hintergrund-Dienst (Daemon) gestartet wird und auch beim Herunterfahren wieder automatisch beendet wird. Es sollten auch ein paar Besonderheiten berücksichtigt werden, wie z.B. die Möglichkeit den Daemon unter einem unprivilegierten Benutzer-Account ausführen zu können, als auch ein paar Mechanismen, die die Fehlersuche im Fall des Falles nicht so kompliziert machen. Flexibel und leicht anpassbar sollte es auch sein. Ich habe mich auch bemüht alles gut zu dokumentieren, falls jemand was ändern ober aber nur verstehen möchte. Das Script ist für CentOS 6.x geschrieben und optimiert, sollte aber auch problemlos mit CentOS 5.x und Red Hat Enterprise Linux (RHEL) 5 und 6 funktionieren. Auf Fedora sollte es auch laufen bzw. leicht anpassbar sein.

Herausgekommen ist dabei folgendes Init-Script:


Code


#!/bin/bash
#
# chkconfig : 35 70 30


#
# Name         : Jameica Server Daemon
#
# Version      : 1.0 (06.2015)
#

#
# Prozess      : jameicad
#
# Beschreibung : Starten, beenden, neustarten und Statusabfrage für Jameica Server Daemon
#              
#                Der Jameica Server Daemon verwaltet die Jameica-Plattform von Olaf Willhun
#                (https://www.willuhn.de/products/jameica/), eine freie Laufzeit-Umgebung
#                für Java-Anwendungen, die in Form von Plugins implementiert werden können,
#                als Server-Dienst im Hintergrund.
#
#                Das Jameica Server Daemon Script wurde für das Betriebssystem CentOS 6.x
#                entwickelt und optimiert, und dient hier in erster Linie dem Betrieb eines
#                dedizierten Hibiscus HBCI Payment Servers als Plugin der Jameica-Plattform.
#
# Autor        : Christian B. Caldarone
#


# ------------------------------------------------------
# Einbindung und Definition von Funktionen und Variablen
# ------------------------------------------------------

 
# Einbindung der Funktionsbibliothek für das Init-System

. /etc/rc.d/init.d/functions


# Benutzer-Account unter welchem der Jameica Server ausgeführt wird.
# Hier sollte ein unprivilegierter Benutzer verwendet werden und
# keinesfalls 'root'.

DAEMON_USER="jameica"


# Vollständiger Pfad zum Shell Start-Script für den Jameica-Server

JAMEICA_CMD="/opt/jameica/jameicaserver.sh"


# Zeichenkette um den Jameica Server in der Liste laufender Prozesse identifizieren zu können,
# verwendet für die Ermittlung der Process ID (PID) 

JAMEICA="jameica-linux.jar"


# Freundlicher Name, wird für Ausgabe-Meldungen dieses Scripts verwendet und hat rein beschreibenden Charakter 

FRIENDLY_NAME="Jameica-Server"


# Diese Zeichenfolge muss genau so lauten, wie der Dateiname dieses Scripts, wird verwendet um den Koventionen
# des Init-Subsystems zu entsprechen 

proc="jameicad"


# Variable 'retval' dient zum Zwischenspreichern von Rückgabewerten ausgeführter Kommandozeilen-Befehle

retval=0


# Variable 'verbosity' steuert die Ausgabe dieses Scripts: 0 = keine Ausgabe, 1 = alles Ausgeben, kann auch
# zusätzlich über den Parameter '-v' oder '--verbose' temporär beim Aufruf mit angegeben werden

verbose=0


# Vollständiger Pfad zum Lock-File und zum PID-File, verwendet vom Init-Subsystem

lockfile="/var/lock/subsys/$proc"
pidfile="/var/run/$proc.pid"


# Ermitteln, ob der Jameica-Server bereits läuft und ggf. PID in Variable speichern

JAMEICA_PID="$(pgrep -u $DAEMON_USER -f $JAMEICA 2>/dev/null)"

#echo $JAMEICA_PID


# ----------------------------------------------------
# Unterprocramm für den Aufruf des Scripts mit "start"
# ----------------------------------------------------

start() { 
  # Prüfen ob das Shell Start-Script für den Jameica-Server existiert und ausführbar ist, wenn nicht, direkt mit Fehler zurück

  if [ ! -x $JAMEICA_CMD ]; then

    verbosity "Datei '$JAMEICA_CMD' existiert nicht oder ist nicht ausführbar. Abbruch.\n"
    return 1

  fi

  
  # Nun prüfen ob Jameica schon ein PID hat, d.h. schon läuft

  if [ "$JAMEICA_PID" == ""  ]; then # Der Jameica Server läuft noch nicht, also starten ...
    
    # Der Jameica Server wird als Daemon-Prozess im Hintergrund unter dem Benutzer aus '$DAEMON_USER' gestartet

    verbosity "$FRIENDLY_NAME wird nun unter Benutzer '$DAEMON_USER' gestartet\n"

    daemon --user $DAEMON_USER $JAMEICA_CMD >/dev/null 2>&1 &

    # Rückgabewert des Starts des Daemon-Prozesses zwischenspeichern 

    retval=$?
    
    # Maximale Wartezeit in Sekunden für den vollständigen Start des Jameica Servers festlegen 

    waittime=30

    # Anfangszähler auf Null setzen

        count=0

    # Warte nun bis der Jameica Server gestartet ist, oder die maximale Wartezeit erreicht ist

    verbosity "Warten bis $FRIENDLY_NAME gestartet wurde...\n"

    until [ ! "$JAMEICA_PID" == "" ] || [ $count -gt $waittime ]
    
    do

      # Im Abstand einer Sekunde prüfen, ob der Jameica Server Prozess gestartet ist,
      # d.h. ob der Prozess eine PID zurückgibt

            JAMEICA_PID="$(pgrep -u $DAEMON_USER -f $JAMEICA 2>/dev/null)"
      sleep 1
            let count=$count+1

        done
 
    # Konnte der Prozess nicht erfolgreich innerhalb der max. Wartezeit gestartet werden,
    # dann direkt mit Time-out Fehler beenden

        if [ $count -gt $waittime ]; then

      verbosity "Time out!\n"
      verbosity "Der Prozess $FRIENDLY_NAME konnte nicht innerhalb von "$count"s gestartet werden\n"
      return 1

    fi
            

    # Wurde der Prozess erfolgreich gestartet, dann Lock-File und PID-File schreiben
    
    if [ $retval -eq 0 ]; then

      touch $lockfile
      verbosity "Erstellt: $lockfile\n"
      echo "$(pgrep -u $DAEMON_USER -f $JAMEICA)" > $pidfile
      verbosity "Erstellt: $pidfile\n"
      verbosity "$FRIENDLY_NAME wurde innerhalb von "$count"s erfolgreich gestartet\n"
      
    fi

  

  else # Für den Fall, dass oben festgestellt wurde, dass Jameica schon ein PID hat, d.h. schon läuft

    # ...ausgeben, mit welcher PID der Jameica Server läuft

    verbosity "$FRIENDLY_NAME$(status -p $pidfile)\n"
        

  fi
    
  # Unterprogramm mit Rückgabewert beenden

      return $retval
}



# ---------------------------------------------------
# Unterprogramm für den Aufruf des Scripts mit "stop"
# ---------------------------------------------------

stop() {

  # Prüfen anhand der PID, ob der Jameica Server überhaupt läuft

  if [ "$JAMEICA_PID" == ""  ]; then # ...wenn nicht, direkt zurück, da er bereits gestoppt ist 
      
    verbosity "$FRIENDLY_NAME ist bereits beendet\n"
    return 0

  else # wenn doch, dann den Prozess beenden

    
    # Mit killproc über PID-File als präferierte Methode beenden

    killproc -p $pidfile >/dev/null 2>&1
    
    retval=$?
    
    verbosity "$FRIENDLY_NAME wird nun beendet\n"

    # Maximale Wartezeit in Sekunden für das vollständige Beenden des Jameica Servers festlegen

    waittime=30

    # Anfangszähler auf Null setzen

        count=0

    # Warte nun bis der Jameica Server beendet ist, oder die maximale Wartezeit erreicht ist 

    verbosity "Warten bis $FRIENDLY_NAME beendet ist...\n"

    until [ "$JAMEICA_PID" == "" ] || [ $count -gt $waittime ]
    
    do

      # Im Abstand einer Sekunde prüfen, ob der Jameica Server Prozess noch läuft,
      # d.h. ob der Prozess immer noch eine PID zurückgibt

            JAMEICA_PID="$(pgrep -u $DAEMON_USER -f $JAMEICA 2>/dev/null)"
      sleep 1
            let count=$count+1;

        done

    # Konnte der Prozess nicht erfolgreich innerhalb der max. Wartezeit beendet werden,
    # dann direkt mit Time-Out Fehler beenden
 
        if [ $count -gt $waittime ]; then

      retval=1
      verbosity "Time out!\n"
      verbosity "$FRIENDLY_NAME konnte nicht innerhalb von "$count"s beendet werden\n"
      return 1

    fi
    
    # Wurde der Prozess erfolgreich beendet, dann Lock-File und PID-File löschen

    if [ $retval -eq 0 ]; then

      rm -f $lockfile
      verbosity "Gelöscht: $lockfile\n"
      rm -f $pidfile
      verbosity "Gelöscht: $pidfile\n"
      verbosity "$FRIENDLY_NAME wurde innerhalb von "$count"s beendet\n"
      
    fi
  
    
      fi

  # Unterprogramm mit Rückgabewert beenden
    
      return $retval
}


# ------------------------------------------------------
# Unterprogramm für den Aufruf des Scripts mit "restart"
# ------------------------------------------------------

restart() {

    
    stop
    start

}


# -----------------------------------------------------
# Unterprogramm für den Aufruf des Scripts mit "status"
# -----------------------------------------------------

get_status() {

    verbosity "Prozessname   : $proc\n"
    verbosity "Anzeigename   : $FRIENDLY_NAME\n"
    verbosity "Benutzer      : $DAEMON_USER\n"
    verbosity "Hauptprogramm : $JAMEICA_CMD\n"
    
    [ ! -e $lockfile ] || verbosity "Lockfile      : $lockfile\n"

    [ ! -e $pidfile ] || verbosity "Pidfile       : $pidfile\n"
    
    verbosity "Status        : "

    echo "$FRIENDLY_NAME" $(status -p $pidfile)
    
}


# ------------------------------------------------------
# Unterprogramm für die Ausgabe wenn "verbose" aktiviert
# ------------------------------------------------------

verbosity() {

if [ $verbose -gt 0 ]; then

  echo -ne "[$proc] $*"

fi


}


# ----------------------------------------------------
# Unterprogramm zur Überprüfung Existenz "DAEMON_USER"
# ----------------------------------------------------

check_user() {

    DAEMON_USER_UID=$(id -u $DAEMON_USER 2>/dev/null)

    [ $DAEMON_USER_UID ] || { verbosity "Benutzer '$DAEMON_USER' existiert nicht. Abbruch.\n" ; exit 1 ; }

}


# ---------------------------------------------------------------
# Auswertung und Verzweigung bzw. Aufruf der entsprechenen Unter-
# Programme nach den an dieses Script übergebenen Parametern
#
# Aktuell: start, stop, restart, status, bzw. zusätzlich mit -v
# ---------------------------------------------------------------

case "$2" in

    -v|--verbose)
      verbose=1
      verbosity "Ausgabe aller Meldungen mit '-v' oder '--verbose' aktiviert.\n"
    ;;

esac

case "$1" in
    
    start)
      check_user
      $1
      retval=$?
    ;;

    stop)
      check_user
      $1
      retval=$?
    ;;
    
    restart)
      check_user
      $1
      retval=$?
    ;;
    status)
      check_user
      get_status
      exit 0
    ;;

    *)
            echo $"Usage: $0 {start|stop|status|restart}"
            exit 2

esac


# Ende des Init-Scripts mit Ausgabe [  OK  ] oder [FAILED] anhand Rückgabewert von 'retval'

if [ "$retval" = "0" ] || [ "$retval" = "" ]; then

  success
  echo
  exit 0

else

  failure
  echo
  exit 1

fi


exit





Einfach als 'root' den Code in eine neue Text-Datei einfügen oder fertige Datei aus dem Anhang herunterladen und anschließend mit dem Namen 'jameicad" in /etc/init.d/ speichern.

Ggf. noch die Variablen anpassen, speziell Benutzer und wo sich 'jameicaserver.sh' befindet wenn nicht in /opt/jameica

Dann auf der Kommandozeile den Dienst mit 'chkconfig --add jameicad' hinzufügen.

Zur Überprüfung 'chkconfig --list jameicad' eingeben, die Ausgabe sollte wie folgt sein:

ameicad 0:off 1:off 2:off 3:on 4:off 5:on 6:off

Fertig. Jetzt sollte Jameica beim Hoch-/Herunterfahren automatisch gestartet und beendet werden.

Um das ganze per Hand durchzuführen, einfach folgendes auf der Kommandozeile eingeben:

service jameicad start

service jameicad stop

oder

service jameicad status

Tipp: Wenn man noch den Parameter -v oder --verbose mit dranhängt, wird der Daemon gesprächiger, z.B. 'service jameicad status -v'

Da Jameica beim Start nach einem Master-Password fragt, muss dieses in der 'jameicaserver.sh" übergeben werden, da der Daemon ja im Hintergrund laufen soll und nicht auf eine Password-Eingabe warten kann/soll.

Ich habe daher meine 'jameicaserver.sh" wie folgt abgeändert (das Password wird hier vorher in der Datei '.pass' abgelegt und dann mit 'cat' ausgelesen

Code

password=$(cat /opt/jameica/.pass)
echo $password | java -Djava.net.preferIPv4Stack=true -Xmx256m $_JCONSOLE -jar jameica-linux.jar -d $@


Man könnte das aber auch so lösen (einfacher)

Code

echo "meinpassword" | java -Djava.net.preferIPv4Stack=true -Xmx256m $_JCONSOLE -jar jameica-linux.jar -d $@
Benutzer
Avatar
Geschlecht: keine Angabe
Herkunft: Leipzig
Homepage: willuhn.de/
Beiträge: 10071
Dabei seit: 03 / 2005
Betreff:

Re: Jameica/Hibiscus Server Daemon

 · 
Gepostet: 10.06.2015 - 11:15 Uhr  ·  #2
Vielen Dank fuer das Init-Script und die Anleitung!
Kann ich es mit in Jameica uebernehmen? Dort ist ja bereits fuer SuSE eines enthalten. Dann koennten kuenftig auch CentOS-User ein out-of-the-box funktionierendes Init-Script nutzen.
CBC
Benutzer
Avatar
Geschlecht:
Herkunft: Bonn
Homepage: viaembedded.com
Beiträge: 81
Dabei seit: 06 / 2015
Betreff:

Gerne doch ;)

 · 
Gepostet: 10.06.2015 - 12:15 Uhr  ·  #3
Danke, freut mich. Kannst Du gerne mit übernehmen, Olaf.

Eventuell hätte ich da in Kürze auch noch einen simplen Email-Negativ-Umsatz-Warner, ebenfalls als Shell Script für Cron ... läuft schon ganz gut, muss ich aber noch in ein veröffentlichungswürdiges Format bringen...

...und wo ich gerade schon einmal dabei bin: Hätte auch Interesse, Jameica/Hibiscus auf Englisch zu übersetzen. Gibt es so was wie eine Sprachdatei?
Benutzer
Avatar
Geschlecht: keine Angabe
Herkunft: Leipzig
Homepage: willuhn.de/
Beiträge: 10071
Dabei seit: 03 / 2005
Betreff:

Re: Jameica/Hibiscus Server Daemon

 · 
Gepostet: 10.06.2015 - 12:35 Uhr  ·  #4
Danke! Script ist eingecheckt. https://github.com/willuhn/jam…5024cc3582

Zitat
Jameica/Hibiscus auf Englisch zu übersetzen. Gibt es so was wie eine Sprachdatei?


Ja, schau mal unter https://github.com/willuhn/jameica/tree/master/src/lang
Da finden sich die Dateien fuer Jameica. Das selbe geht auch bei Hibiscus unter https://github.com/willuhn/hibiscus/tree/master/src/lang (dort existieren jedoch keinerlei Uebersetzungen).

Die fuer Jameica existierenden Uebersetzungen sind sehr unvollstaendig und veraltet. Ich hatte das damals nur erstellt, um die Funktionsfaehigkeit zu testen. Die Sprache kann in "~/.jameica/cfg/de.willuhn.jameica.system.Config.properties" umgestellt werden mit (eine Option in der GUI gibt es nicht mehr dafuer):

Code

jameica.system.locale=de_DE
#jameica.system.locale=en_GB


In den eigentlichen Uebersetzungsdateien "*_messages_....properties" dient der original im deutschen angezeigte Text als Key. Achtung, Leerzeichen und Doppelpunkte muessen da mit "\" escaped werden. In https://github.com/willuhn/jam…properties sieht man es beispielhaft.
Da die Dateien unvollstaendig sind, waere die Vervollstaendigung mit den noch fehlenden Strings sehr aufwaendig. Daher gibt es eine Moeglichkeit, beim Beenden automatisch eine Properties-Datei als Template zu erzeugen, in der die deutschen Keys bereits drin stehen, die waehrend der aktuellen Sitzung nicht uebersetzt werden konnten.

Fuege hierzu in "~/.jameica/cfg/de.willuhn.jameica.system.Config.properties" folgende Zeile hinzu:

Code

jameica.system.i18n.untranslated.dir=/tmp


Dann werden beim Beenden von Jameica die Dateien system_messages_$locale.properties und hibiscus_messages_$locale.properties angelegt.
Die enthalten dann alle Keys, zu denen in der Sitzung keine Uebersetzungen gefunden wurden. Das heisst - um da hinreichend viele Text-Schluessel zu generieren, muss man einmal durch die ganze Anwendung klicken, um den Uebersetzungsversuch zu triggern. Komplett alle Texte kann man damit aber nicht erfassen, da man hierzu ja auch alle moeglichen Fehler-Situationen triggern muesste.
CBC
Benutzer
Avatar
Geschlecht:
Herkunft: Bonn
Homepage: viaembedded.com
Beiträge: 81
Dabei seit: 06 / 2015
Betreff:

Re: Jameica/Hibiscus Server Daemon

 · 
Gepostet: 16.06.2015 - 15:10 Uhr  ·  #5
Danke. Hab mir die Message Properties mal generieren lassen. Ist zwar ein bischen Arbeit, aber ich denke wenn erst mal die wesentlichen Sachen übersetzt sind, dann kann man ja sukzessive die fehlenden Strings nach-editieren.

Ich werd mich in der nächsten Zeit mal ran machen und schauen, wie weit ich komme.
Benutzer
Avatar
Geschlecht: keine Angabe
Herkunft: Leipzig
Homepage: willuhn.de/
Beiträge: 10071
Dabei seit: 03 / 2005
Betreff:

Re: Jameica/Hibiscus Server Daemon

 · 
Gepostet: 16.06.2015 - 16:27 Uhr  ·  #6
Mal so interessehalber: Warum willst du das eigentlich alles uebersetzen? Hibiscus wird ja im Prinzip nur in Deutschland verwendet, da es FinTS ohnehin nur hier gibt. Wofuer willst du dir da diese Arbeit machen?
CBC
Benutzer
Avatar
Geschlecht:
Herkunft: Bonn
Homepage: viaembedded.com
Beiträge: 81
Dabei seit: 06 / 2015
Betreff:

Re: Jameica/Hibiscus Server Daemon

 · 
Gepostet: 16.06.2015 - 17:04 Uhr  ·  #7
Zitat geschrieben von hibiscus

Mal so interessehalber: Warum willst du das eigentlich alles uebersetzen? Hibiscus wird ja im Prinzip nur in Deutschland verwendet, da es FinTS ohnehin nur hier gibt. Wofuer willst du dir da diese Arbeit machen?



Ich denke da als Anwendungsgebiet an ein ausländisches Unternehmen, welches gerne mal einen Blick in die Umsätze/Kontobewegungen der deutschen Niederlassung werfen möchte ;)

Grundsätzliches Problem ist ja tatsächlich, dass aufgrund HBCI/FinTS - wie Du schon sagtest - das Gros an Software nur in deutscher Sprache erhältlich ist. Zum mal gucken wäre es also nicht schlecht, eine englische GUI zu haben, mit der man aus der Ferne auf den Datenbestand im MySQL Backend zugreifen kann. Aber mit Sicherheit gibt es in Deutschland auch den ein oder anderen Ausländer, der gerne deutsche Bankgeschäfte an einer deutschen Bank erledigen möchte und mit einer englischen GUI besser zurecht kommt.

Alternativ könnte man ja auch die Sprache des Webfrontends vom HibIscus-Server anpassen und eventuell die Umsatz-Details für ein bestimmtes Konto herauslösen und in einem separaten Fenster anzeigen ... irgendwie finde ich die Hibiscus GUI aus der Ferne mit SSL Zugriff auf MySQL aber charmanter.

Was ich bis dato auch noch nicht probiert habe, ist auf dem selben Host wie Hibiscus-Server eine GUI über SSH/X11 forwarding zu starten (unter einem anderen Benutzer als der Hibiscus-Server selbst), so dass diese quasi als Seamless-Anwendung auf dem Client erscheint. Prinzipiell funktioniert das Konzept ja ganz gut, für Windoiws gibt es ja sogar gute und freie X-Server, so dass Jameica/Hibiscus in den Genuss eines Terminal-Server Betriebs kommt, aber nur eine zentrale Instanz verwaltet und gepflegt werden muss .... oha ... jetzt drifte ich aber ab.
kim
Neuling
Avatar
Geschlecht: keine Angabe
Beiträge: 1
Dabei seit: 06 / 2015
Betreff:

Init-Script für ubuntu?

 · 
Gepostet: 22.06.2015 - 20:43 Uhr  ·  #8
Hallo, gibt es für ubuntu 14.04 LTS auch schon ein init-Script?
Ich habe mir den Hibiscus-Server installiert und ein Konto eingerichtet, aber mit dem Start beim booten scheitere ich kläglich :)
Ich verstehe zwar was in den Skripten geschieht, kann es aber selbst für ubuntu nicht umsetzen :(
CBC
Benutzer
Avatar
Geschlecht:
Herkunft: Bonn
Homepage: viaembedded.com
Beiträge: 81
Dabei seit: 06 / 2015
Betreff:

Re: Jameica/Hibiscus Server Daemon

 · 
Gepostet: 24.06.2015 - 00:00 Uhr  ·  #9
Zitat geschrieben von kim

Hallo, gibt es für ubuntu 14.04 LTS auch schon ein init-Script?
Ich habe mir den Hibiscus-Server installiert und ein Konto eingerichtet, aber mit dem Start beim booten scheitere ich kläglich :)
Ich verstehe zwar was in den Skripten geschieht, kann es aber selbst für ubuntu nicht umsetzen :(


Hallo Kim,

ein extra Ubuntu Init-Script gibt es (noch) nicht, aber ich bin mir sicher, dass es mit Deiner Hilfe bald eins gibt :)

Prinzipiell sollte das Script nicht schwer für Ubuntu's 14.04 Upstart anzupassen sein, ab 14.10 ist ja glaube ich systemd der Standard Das ist ja wieder ganz anders.

Spontan fallen mir die folgenden Änderungen ein:

# Einbindung der Funktionsbibliothek für das Init-System

. /etc/rc.d/init.d/functions

ändern in

. /lib/lsb/init-functions


# Der Jameica Server wird als Daemon-Prozess im Hintergrund unter dem Benutzer aus '$DAEMON_USER' gestartet

daemon --user $DAEMON_USER $JAMEICA_CMD >/dev/null 2>&1 &

ändern in

start-stop-daemon <optionen>

siehe : http://manpages.ubuntu.com/man…mon.8.html

Dann wäre da noch solche Sachen wie killproc, von denen ich nicht weiß, ob es das bei Ubuntu überhaupt gibt.

Wahrscheinlich wäre es nützlich, das Init Script erst mal einzubinden und dann schrittweise anzupassen, ganz jenachdem, welche Fehlermeldungen auftauen, bzw. welches Verhalten sich reproduzieren lässt.

Vielleicht orientiert Du Dich erstmal an anderen Init Scripts für Ubuntu um die nötigen Änderungen zu verstehen. Mit Beispielen ist immer alles leichter, z.B.

https://github.com/JasonGiedym…ster/nginx

http://wiki.ubuntuusers.de/upstart

http://www.itzgeek.com/how-tos…14-10.html


Mein Original-Script ist auch deshalb so komplex geworden, weil es allerlei Sonderfälle beachtet, z.B. unterscheidet ob die Hibiscus-Server PID tatsächlich vom Daemon stammt oder das Programm als Desktop-Anwendung gestartet wurde, z.B. beendet werden sollte ja nur der Daemon ... so kann man neben dem Daemon eben auch mehrere Instanzen starten.

Probier mal ein wenig rum und schreibe hier wie weit Du gekommen bist...

Gruß

Christian
Neuling
Avatar
Geschlecht: keine Angabe
Beiträge: 1
Dabei seit: 10 / 2015
Betreff:

Re: Jameica/Hibiscus Server Daemon

 · 
Gepostet: 21.10.2015 - 19:36 Uhr  ·  #10
Vielen Dank Christian!

Ich habe das Script mal für Ubuntu angepasst (viel musste nicht geändert werden und du hast ja auch schon ein paar Tipps gegeben :))

Code

#!/bin/bash
#
# chkconfig : 35 70 30


#
# Name         : Jameica Server Daemon
#
# Version      : 1.0 (06.2015)
#

#
# Prozess      : jameicad
#
# Beschreibung : Starten, beenden, neustarten und Statusabfrage für Jameica Server Daemon
#              
#                Der Jameica Server Daemon verwaltet die Jameica-Plattform von Olaf Willhun
#                (https://www.willuhn.de/products/jameica/), eine freie Laufzeit-Umgebung
#                für Java-Anwendungen, die in Form von Plugins implementiert werden können,
#                als Server-Dienst im Hintergrund.
#
#                Das Jameica Server Daemon Script wurde für das Betriebssystem Ubuntu 14.04LTS
#                entwickelt und optimiert, und dient hier in erster Linie dem Betrieb eines
#                dedizierten Hibiscus HBCI Payment Servers als Plugin der Jameica-Plattform.
#
# Autor        : Christian B. Caldarone
# Änderungen für Ubuntu durch Sebastian Dernbach
#


# ------------------------------------------------------
# Einbindung und Definition von Funktionen und Variablen
# ------------------------------------------------------

 
# Einbindung der Funktionsbibliothek für das Init-System
. /lib/lsb/init-functions

# Benutzer-Account unter welchem der Jameica Server ausgeführt wird.
# Hier sollte ein unprivilegierter Benutzer verwendet werden und
# keinesfalls 'root'.

DAEMON_USER="username"


# Vollständiger Pfad zum Shell Start-Script für den Jameica-Server

JAMEICA_CMD="/opt/jameica/hibiscus-server/jameicaserver.sh"


# Zeichenkette um den Jameica Server in der Liste laufender Prozesse identifizieren zu können,
# verwendet für die Ermittlung der Process ID (PID) 

JAMEICA="jameica-linux.jar"


# Freundlicher Name, wird für Ausgabe-Meldungen dieses Scripts verwendet und hat rein beschreibenden Charakter 

FRIENDLY_NAME="Jameica-Server"


# Diese Zeichenfolge muss genau so lauten, wie der Dateiname dieses Scripts, wird verwendet um den Koventionen
# des Init-Subsystems zu entsprechen 

proc="jameicad"


# Variable 'retval' dient zum Zwischenspreichern von Rückgabewerten ausgeführter Kommandozeilen-Befehle

retval=0


# Variable 'verbosity' steuert die Ausgabe dieses Scripts: 0 = keine Ausgabe, 1 = alles Ausgeben, kann auch
# zusätzlich über den Parameter '-v' oder '--verbose' temporär beim Aufruf mit angegeben werden

verbose=0


# Vollständiger Pfad zum Lock-File und zum PID-File, verwendet vom Init-Subsystem

#lockfile="/var/lock/subsys/$proc"
pidfile="/var/run/$proc.pid"


# Ermitteln, ob der Jameica-Server bereits läuft und ggf. PID in Variable speichern

JAMEICA_PID="$(pgrep -U $DAEMON_USER -f $JAMEICA 2>/dev/null)"

#echo $JAMEICA_PID


# ----------------------------------------------------
# Unterprocramm für den Aufruf des Scripts mit "start"
# ----------------------------------------------------

start() { 
  # Prüfen ob das Shell Start-Script für den Jameica-Server existiert und ausführbar ist, wenn nicht, direkt mit Fehler zurück

  if [ ! -x $JAMEICA_CMD ]; then

    verbosity "Datei '$JAMEICA_CMD' existiert nicht oder ist nicht ausführbar. Abbruch.\n"
    return 1

  fi

  
  # Nun prüfen ob Jameica schon ein PID hat, d.h. schon läuft

  if [ "$JAMEICA_PID" == ""  ]; then # Der Jameica Server läuft noch nicht, also starten ...
    
    # Der Jameica Server wird als Daemon-Prozess im Hintergrund unter dem Benutzer aus '$DAEMON_USER' gestartet

    verbosity "$FRIENDLY_NAME wird nun unter Benutzer '$DAEMON_USER' gestartet\n"

    start-stop-daemon --start --chuid $DAEMON_USER --exec $JAMEICA_CMD >/dev/null 2>&1 &
    #daemon --user $DAEMON_USER $JAMEICA_CMD >/dev/null 2>&1 &

    # Rückgabewert des Starts des Daemon-Prozesses zwischenspeichern 

    retval=$?
    
    # Maximale Wartezeit in Sekunden für den vollständigen Start des Jameica Servers festlegen 

    waittime=30

    # Anfangszähler auf Null setzen

        count=0

    # Warte nun bis der Jameica Server gestartet ist, oder die maximale Wartezeit erreicht ist

    verbosity "Warten bis $FRIENDLY_NAME gestartet wurde...\n"

    until [ ! "$JAMEICA_PID" == "" ] || [ $count -gt $waittime ]
    
    do

      # Im Abstand einer Sekunde prüfen, ob der Jameica Server Prozess gestartet ist,
      # d.h. ob der Prozess eine PID zurückgibt

            JAMEICA_PID="$(pgrep -U $DAEMON_USER -f $JAMEICA 2>/dev/null)"
      sleep 1
            let count=$count+1

        done
 
    # Konnte der Prozess nicht erfolgreich innerhalb der max. Wartezeit gestartet werden,
    # dann direkt mit Time-out Fehler beenden

        if [ $count -gt $waittime ]; then

      verbosity "Time out!\n"
      verbosity "Der Prozess $FRIENDLY_NAME konnte nicht innerhalb von "$count"s gestartet werden\n"
      return 1

    fi
            

    # Wurde der Prozess erfolgreich gestartet, dann Lock-File und PID-File schreiben
    
    if [ $retval -eq 0 ]; then

      #touch $lockfile
      #verbosity "Erstellt: $lockfile\n"
      echo "$(pgrep -U $DAEMON_USER -f $JAMEICA)" > $pidfile
      verbosity "Erstellt: $pidfile\n"
      verbosity "$FRIENDLY_NAME wurde innerhalb von "$count"s erfolgreich gestartet\n"
      
    fi

  

  else # Für den Fall, dass oben festgestellt wurde, dass Jameica schon ein PID hat, d.h. schon läuft

    # ...ausgeben, mit welcher PID der Jameica Server läuft
    JAMEICA_PID="$(pgrep -f $JAMEICA 2>/dev/null)"
    verbosity "$FRIENDLY_NAME $JAMEICA_PID\n"
        

  fi
    
  # Unterprogramm mit Rückgabewert beenden

      return $retval
}



# ---------------------------------------------------
# Unterprogramm für den Aufruf des Scripts mit "stop"
# ---------------------------------------------------

stop() {

  # Prüfen anhand der PID, ob der Jameica Server überhaupt läuft

  if [ "$JAMEICA_PID" == ""  ]; then # ...wenn nicht, direkt zurück, da er bereits gestoppt ist 
      
    verbosity "$FRIENDLY_NAME ist bereits beendet\n"
    return 0

  else # wenn doch, dann den Prozess beenden

    
    # Mit killproc über PID-File als präferierte Methode beenden

    kill $JAMEICA_PID >/dev/null 2>&1
    
    retval=$?
    
    verbosity "$FRIENDLY_NAME wird nun beendet\n"

    # Maximale Wartezeit in Sekunden für das vollständige Beenden des Jameica Servers festlegen

    waittime=30

    # Anfangszähler auf Null setzen

        count=0

    # Warte nun bis der Jameica Server beendet ist, oder die maximale Wartezeit erreicht ist 

    verbosity "Warten bis $FRIENDLY_NAME beendet ist...\n"

    until [ "$JAMEICA_PID" == "" ] || [ $count -gt $waittime ]
    
    do

      # Im Abstand einer Sekunde prüfen, ob der Jameica Server Prozess noch läuft,
      # d.h. ob der Prozess immer noch eine PID zurückgibt

            JAMEICA_PID="$(pgrep -U $DAEMON_USER -f $JAMEICA 2>/dev/null)"
      sleep 1
            let count=$count+1;

        done

    # Konnte der Prozess nicht erfolgreich innerhalb der max. Wartezeit beendet werden,
    # dann direkt mit Time-Out Fehler beenden
 
        if [ $count -gt $waittime ]; then

      retval=1
      verbosity "Time out!\n"
      verbosity "$FRIENDLY_NAME konnte nicht innerhalb von "$count"s beendet werden\n"
      return 1

    fi
    
    # Wurde der Prozess erfolgreich beendet, dann Lock-File und PID-File löschen

    if [ $retval -eq 0 ]; then

      rm -f $lockfile
      verbosity "Gelöscht: $lockfile\n"
      rm -f $pidfile
      verbosity "Gelöscht: $pidfile\n"
      verbosity "$FRIENDLY_NAME wurde innerhalb von "$count"s beendet\n"
      
    fi
  
    
      fi

  # Unterprogramm mit Rückgabewert beenden
    
      return $retval
}


# ------------------------------------------------------
# Unterprogramm für den Aufruf des Scripts mit "restart"
# ------------------------------------------------------

restart() {

    
    stop
    start

}


# -----------------------------------------------------
# Unterprogramm für den Aufruf des Scripts mit "status"
# -----------------------------------------------------

get_status() {

    verbosity "Prozessname   : $proc\n"
    verbosity "Anzeigename   : $FRIENDLY_NAME\n"
    verbosity "Benutzer      : $DAEMON_USER\n"
    verbosity "Hauptprogramm : $JAMEICA_CMD\n"
    
    #[ ! -e $lockfile ] || verbosity "Lockfile      : $lockfile\n"

    [ ! -e $pidfile ] || verbosity "Pidfile       : $pidfile\n"
    
    #verbosity "Status        : "

    #echo "$FRIENDLY_NAME" $(status -p $pidfile)
    
}


# ------------------------------------------------------
# Unterprogramm für die Ausgabe wenn "verbose" aktiviert
# ------------------------------------------------------

verbosity() {

if [ $verbose -gt 0 ]; then

  echo -ne "[$proc] $*"

fi


}


# ----------------------------------------------------
# Unterprogramm zur Überprüfung Existenz "DAEMON_USER"
# ----------------------------------------------------

check_user() {

    DAEMON_USER_UID=$(id -u $DAEMON_USER 2>/dev/null)

    [ $DAEMON_USER_UID ] || { verbosity "Benutzer '$DAEMON_USER' existiert nicht. Abbruch.\n" ; exit 1 ; }

}


# ---------------------------------------------------------------
# Auswertung und Verzweigung bzw. Aufruf der entsprechenen Unter-
# Programme nach den an dieses Script übergebenen Parametern
#
# Aktuell: start, stop, restart, status, bzw. zusätzlich mit -v
# ---------------------------------------------------------------

case "$2" in

    -v|--verbose)
      verbose=1
      verbosity "Ausgabe aller Meldungen mit '-v' oder '--verbose' aktiviert.\n"
    ;;

esac

case "$1" in
    
    start)
      check_user
      $1
      retval=$?
    ;;

    stop)
      check_user
      $1
      retval=$?
    ;;
    
    restart)
      check_user
      $1
      retval=$?
    ;;
    status)
      check_user
      get_status
      exit 0
    ;;

    *)
            echo $"Usage: $0 {start|stop|status|restart}"
            exit 2

esac


# Ende des Init-Scripts mit Ausgabe [  OK  ] oder [FAILED] anhand Rückgabewert von 'retval'

if [ "$retval" = "0" ] || [ "$retval" = "" ]; then

  #success
  echo
  exit 0

else

  #failure
  echo
  exit 1

fi


exit


Installieren lässt es sich unter Ubuntu mit

Code
update-rc.d jameicad defaults


Deinstallieren mit

Code
update-rc.d -f jameicad  remove
CBC
Benutzer
Avatar
Geschlecht:
Herkunft: Bonn
Homepage: viaembedded.com
Beiträge: 81
Dabei seit: 06 / 2015
Betreff:

Re: Jameica/Hibiscus Server Daemon

 · 
Gepostet: 02.11.2015 - 15:21 Uhr  ·  #11
Vielen Dank, Sebastian!

Da bin ich ja happy, dass nicht so viel geändert werden musste, denn ich habe mich tatsächlich bemüht, bei meinen Scripten immer relativ Distro-unabhängig zu bleiben ... gelingt halt mal besser und mal schlechter ;)
Benutzer
Avatar
Geschlecht: keine Angabe
Beiträge: 7
Dabei seit: 05 / 2016
Betreff:

Re: Jameica/Hibiscus Server Daemon

 · 
Gepostet: 14.06.2016 - 17:33 Uhr  ·  #12
Hi, vielen Dank für das Skript

ich habe die variablen angepasst und das script nach /etc/init.d/ kopiert.
wenn ich nun "sudo service jameicad start" aufrufe erhalte ich:
/etc/init.d/jameicad: 110: [: unexpected operator
kann damit jemand etwas anfangen?
wenn ich das script mit /etc/init.d/jameicad start aufrufe startet das script ohne rückgabe einer pid.
auch sudo service jameica status liefert keine rückgabe.

Weis jemand rat?
Beste Grüße
CBC
Benutzer
Avatar
Geschlecht:
Herkunft: Bonn
Homepage: viaembedded.com
Beiträge: 81
Dabei seit: 06 / 2015
Betreff:

Re: Jameica/Hibiscus Server Daemon

 · 
Gepostet: 04.07.2016 - 11:09 Uhr  ·  #13
Zitat geschrieben von Tschonny_Cache


wenn ich nun "sudo service jameicad start" aufrufe erhalte ich:
/etc/init.d/jameicad: 110: [: unexpected operator
kann damit jemand etwas anfangen?
wenn ich das script mit /etc/init.d/jameicad start aufrufe startet das script ohne rückgabe einer pid.
auch sudo service jameica status liefert keine rückgabe.

Weis jemand rat?
Beste Grüße


Kannst Du mal Dein Script posten? Wäre interessant zu wissen was genau bei Dir in Zeile 110 steht.
Gewählte Zitate für Mehrfachzitierung:   0