[Erledigt] Starten mit systemd

Hinweis: In dem Thema [Erledigt] Starten mit systemd gibt es 11 Antworten auf 2 Seiten. Der letzte Beitrag () befindet sich auf der letzten Seite.
  • Ich versuche gerade einigen SysV Scripte nach systemd umzubauen um sie unter Leap 42.1 weiterzuverwenden. Eines der Binaries weigert sich aber bisher standhaft zu kooperieren ;)


    Es ist ein uralter Daemon, der Daten von der seriellen Schnittstelle liest und an eine Textdatei weiterleitet. Wird das via Kommadozeile gemacht funktioniert alles bestens:


    Code
    # /opt/test/bin/pcwsr /dev/ttyUSB0 >> /var/test/datei.txt &


    Das geht natürlich nur solange bis die Shell geschlossen wird und die Shell selbst bleibt nur nutzbar wenn man das Binary im Hintergrund starten mit &.


    Nun habe ich es für systemd so versucht:



    Nur so funktioniert das überhaupt nicht - da läuft nichts nach dem Start:



    Gerade viel sagt das nicht aus. Ich arbeite mich erst etwas in systemd ein - aber vielleicht kennt sich hier jemand viel besser damit aus und kann mit ein paar Tipps geben.


    Leider funktioniert auch mein altes SysV Script von openSuSE 13.1 unter Leap 42.1 nicht mehr, sonst hätte ich dieses verwenden können.

    Einmal editiert, zuletzt von Sauerland ()

    Für den Inhalt des Beitrages 88182 haftet ausdrücklich der jeweilige Autor: wn48z

  • Den Befehl in ein Script packen und das Script starten?

    Für den Inhalt des Beitrages 88188 haftet ausdrücklich der jeweilige Autor: Sauerland

  • Den Befehl in ein Script packen und das Script starten?

    Das hatte ich auch versucht, aber es funktionierte ebenfalls nicht. Ich habe dann noch etwas die Dokus gewälzt und schlussendlich vermutet, dass systemd wohl mit der Umleitung der Ausgabe in eine Datei nicht klar kommt.


    Ich habe dann die Strategie geändert und herausgefunden, dass systemd selber eine Umleitung des STDOUT anbietet - allerdings nicht direkt in eine Datei.


    Code
    StandardOutput=


    Von den angebotenen Zielen erschien mir syslog am besten, da ich auf meinem Leap System nicht das journal verwende sondern rsyslog installiert habe (es ist ja auch ein Serversystem).


    So baute ich das systemd Script entsprechend um:



    Die Ausgabe war danach tatsächlich in /var/log/messages ersichtlich und der Daemon lief, lies sich stoppen, starten und auch enablen.


    Nun musste ich natürlich noch /etc/rsyslog.conf anpassen, damit die Ausgabe in meine gewünschte Datei erfolgte und gleich wie zuvor aussah - also ohne Zeit, Programm und Host am Anfang jeder Ausgabezeile wie sonst bei syslog üblich:


    Also musste ein Ausgabetemplate her und eine Umleitung in meine Datei:

    Code
    template (name="mySerialFormat" type="string"
    string="%msg%\n")
    if      ($programname == 'pcwsr')
    then {
            -/var/test/datei.txt;mySerialFormat
            stop
    }


    Damit erfolgt nun die Ausgabe wie gewünscht unverändert in die entsprechende Datei und wird dort ausgewertet. Die Lösung ist zwar etwas anders als zuvor, aber sie erscheint mir sogar sauberer implementiert und funktioniert einwandfrei.

    Einmal editiert, zuletzt von wn48z ()

    Für den Inhalt des Beitrages 88189 haftet ausdrücklich der jeweilige Autor: wn48z

  • Da würde mich jetzt doch interessieren, ob sowas gehen würde mit systemd:

    Code
    su pcwsr-user -c ': 3>/mein/pcwsr.log 1>&3 2>&3 pcwsr -p >>&3

    Oder anders formuliert: Hast du dieses pcwsr mal mit -p probiert? Ich denke, nur fehlede fds waren die Ursache.

    Für den Inhalt des Beitrages 88193 haftet ausdrücklich der jeweilige Autor: LinuPia

  • Da würde mich jetzt doch interessieren, ob sowas gehen würde mit systemd:

    Code
    su pcwsr-user -c ': 3>/mein/pcwsr.log 1>&3 2>&3 pcwsr -p >>&3

    Oder anders formuliert: Hast du dieses pcwsr mal mit -p probiert? Ich denke, nur fehlede fds waren die Ursache.


    -p wäre eine Option die man einfach so in der ExecStart Zeile ergänzen könnte. Die Ausgaben für STDOUT und STDERR kann systemd über die genannten Optionen einfangen:


    Code
    StandardOutput=syslog
    StandardError=syslog


    Es gibt noch mehr Optionen als syslog:
    inherit, null, tty, journal, syslog, kmsg, journal+console, syslog+console, kmsg+console, socket

    Für den Inhalt des Beitrages 88198 haftet ausdrücklich der jeweilige Autor: wn48z

  • Ich wollte wissen, ob systemd mit den von mir genannten Umleitungen diesen alten Daemon korrekt laufen lassen kann.
    Dein Problem war nicht systemd, sondern die Tatsache, dass die Ausgabe nicht erledigt werden konnte, weil eben kein gültier Filedescriptor bei deiner Art aufzurufen existiert.
    Die direkt ausgeführten Umleitungen des Prozesses sollten genau das ermöglichen.


    Die -p Option wäre u.U. bei diesen Umleitungen gar nicht nötig.
    Hätte aber bei deinem nicht laufenden systemd Startversuch evtl. geholfen.
    Das sagt zumindest der alte Daemon selbst.


    Was man so alles angeben kann, ist mir klar.
    Aber egal.

    Für den Inhalt des Beitrages 88272 haftet ausdrücklich der jeweilige Autor: LinuPia

  • Umleitungen in ExecStart - egal welcher Art - führen zu einem Startfehler bei diesem Daemon.

    Für den Inhalt des Beitrages 88273 haftet ausdrücklich der jeweilige Autor: wn48z

  • Und die Fehlermeldung lautet bei welchem Befehl __genau__ wie __genau__?


    Es hilft nicht zu schreiben "geht nicht".
    Es mag dir nicht aufgefallen sein: Es geht die ganze Zeit nur um das Problem WIE man eine saubere Umleitung hinkriegt.
    Und ich habe schon einige .service Files geschrieben, die genau das tun.
    Was soll's.


    nachträglicher Edit: in meinem vorhergehenden Post fehlt ein Semikolon und abschließender Apostroph.

    Für den Inhalt des Beitrages 88280 haftet ausdrücklich der jeweilige Autor: LinuPia

  • Ich kann gerne zum Test ein zweites systemd .service File erzeugen, wenn Du wissen möchtest wie sich Deine Lösung verhält und wie die Fehlermeldung aussieht.


    Die Zeile aus Deinem ersten Post kann ich so nicht verwenden, weil es kein pcwsr-user gibt und pcwsr keine Option -c besitzt.


    Im ExecStart geht folgendes nicht:


    Code
    /opt/test/pcwsr /dev/ttyUSB0 3>/tmp/pcwsr.log 1>&3 2>&3
    /opt/test/pcwsr -p /dev/ttyUSB0 3>/tmp/pcwsr.log 1>&3 2>&3
    /opt/test/pcwsr /dev/ttyUSB0 2>&1


    Die Fehlermeldung ist in jedem Fall identisch mit meinem ersten Post.


    Du kannst auch selber experimentieren, der Daemon ist hier zu finden:
    http://sourceforge.net/projects/wth.berlios/files/(Ich verwende hier noch die Version 0.1.4)


    Das Problem ist erledigt und meine selbst gefundene Lösung ist stabil - von daher besteht keine Notwendigkeit, aber wenn es Dich persönlich interessiert ob es auch anders geht, kann ich gerne ein paar Tests für Dich machen.

    Für den Inhalt des Beitrages 88289 haftet ausdrücklich der jeweilige Autor: wn48z

  • **soifz**
    Man hätte den User anlegen können, oder durch den ersetzen, der das normalerweise aufruft.
    Mit diesem su someuser -c command hätte man eine shell gestartet unter dem User.
    Dort hätten die Kommandos : 3>somefile .... (Ja, der Doppelpunkt ist ein Kommando) ausführen können, womit die Umleitungen ...
    Ach, was schreib ich hier sinnlos rum....

    Für den Inhalt des Beitrages 88292 haftet ausdrücklich der jeweilige Autor: LinuPia