Ein Programm mehrmals starten

Warum Debian und/oder eine seiner Spielarten? Was muss ich vorher wissen? Wo geht es nach der Installation weiter?
Antworten
sevi
Beiträge: 58
Registriert: 26.11.2013 13:12:21

Ein Programm mehrmals starten

Beitrag von sevi » 07.03.2014 10:08:05

Hallo,
Ich hätte da eine Grundsatzfrage zum Starten von einem Programm mehrmals.
Als Beispiel nehme ich mal Shairport her. Ich möchte nun Shairport mit unterschiedlichem Port und Soundkarte mehrmals starten.

Möglichkeit 1:
Ich würde mir nun ein Script Basteln das beim Booten gestartet wird
like this:

Code: Alles auswählen

#!/bin/bash
/usr/local/bin/shairport -w -a Shairport -d -p 5300 -o alsa -- -d hw:0,0
/usr/local/bin/shairport -w -a Shairport1 -d -p 5310 -o alsa -- -d hw:1,0
funktioniert Perfekt.

Möglichkeit 2:
Man müsste, wie in diesem Beispiel mit Shairport, die /etc/init.d/shairport Kopieren und umbenenen in zb. shairport01 und den inhalt etwas modifizieren.

Leider kann ich keinen unterschied erkennen außer, dass Möglichkeit 2 viel, viel umständlicher ist.

Meine Fragen:
- Was ist der Unterschied zwischen diesen 2 Versionen?
- Vor- Nachteile?
- Gibt es eine Möglichkeit 3,4,5?
- Wie würdet Ihr das Lösen?


Vielen DANK!!!

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Ein Programm mehrmals starten

Beitrag von rendegast » 07.03.2014 11:10:10

Startest Du Dein Skript als Benutzer shairport:nogroup?
In der Einfachheit gibt es auch eventuell Probleme bei den pid/log/error Dateien.

die /etc/init.d/shairport Kopieren und umbenenen in zb. shairport01 und den inhalt etwas modifizieren.
Würde ich wohl machen. Skriptname,
# Provides: shairport
...
NAME=shairport
entsprechend ändern.
Dann wird die /etc/default/shairport ausgelesen.
Entweder auch mit einer separaten Datei oder einer entsprechenden Sektion in /etc/default/shairport in der Art

Code: Alles auswählen

case "$NAME" in
     shairport)
             LOGFILE="$LOGFILE -p 0000"
             OUTPUT="alsa"
             OUTPUT_OPTS="-d hw:x.y"
     ;;
     shairport01)
             LOGFILE="$LOGFILE -p 0000"
             OUTPUT="alsa"
             OUTPUT_OPTS="-d hw:x.y"
     ;;
     *)
          # irgendein failsave/Abbruch fuer nicht explizit konfigurierte Sachen
             .................
     ;;
esac
(Dadurch stehen die eventuellen Konflikte in einer Datei)

Dann sollen/müssen beide Prozesse wohl auch unterschiedliche Daten / Verzeichnisse bearbeiten.
In https://github.com/abrasive/shairport/b ... hairport.c sehe ich da jetzt keine solche Option,
eventuell trennt sich das über [-a, --name=NAME] (im Startskript erstmal $(hostname)).
Hier speziell würde dazu dann vielleicht auch ein separater DNS-Eintrag gehören.



Speziell dieses Programm, common.c:

Code: Alles auswählen

static char super_secret_key[] =
"-----BEGIN RSA PRIVATE KEY-----\n"
..............
"-----END RSA PRIVATE KEY-----";
Damit nicht mehr PRIVATE?
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

sevi
Beiträge: 58
Registriert: 26.11.2013 13:12:21

Re: Ein Programm mehrmals starten

Beitrag von sevi » 07.03.2014 16:09:15

Okay DANKE für die Antwort.
Ich bin jetzt nicht so der Linux Fuchs und muss meine Frage jetzt noch ein wenig vertiefen. Abgesehen von den vorteilen der 2. Möglichkeit > Separates starten und stoppen, separater error log, separat ....... Ich meine das alles separat ist, das ist mir nämlich klar, läuft das Programm trotzdem absolut stabil? oder gibt es irgendwelche Leistungseinbußen? Habe ich irgendwelche nachteile wenn ich einen RPi jahrelang so betreibe? Welche Lösung währe die sauberere, professionellere?
Mir fällt noch ein Vorteil der 1. Möglichkeit ein. Bei einem Update, was bei einem Linuxprogramm sehr häufig der Fall ist, brauche ich dann nicht alle meine Init.d scripte modifizieren oder?

DANKE!!

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Ein Programm mehrmals starten

Beitrag von rendegast » 07.03.2014 19:03:43

Bei einem Update, was bei einem Linuxprogramm sehr häufig der Fall ist, brauche ich dann nicht alle meine Init.d scripte modifizieren oder?
Ein Paket für einen Dienst sieht im Normalfall einen Restart eines laufenden Dienstes vor.
Bei solch einem Konstrukt wären die abgeleiteten Prozesse unberücksichtigt und würden als altes binary weiterlaufen.

Also entweder drauf achten und entsprechend neu starten,
oder vielleicht läßt sich was mit
DPkg::Post-Invoke { ........; };
zaubern?
Erscheint mir aber schwierig, im Environment des Aufrufs gibt es keinen Hinweis auf die abgelaufenen Installationen.


Vielleicht durch /var/lib/dpkg/trigger/?

Code: Alles auswählen

# grep . /var/lib/dpkg/triggers/*
....
/var/lib/dpkg/triggers/aspell-autobuildhash:dictionaries-common
/var/lib/dpkg/triggers/cleanup-pkgprepare-updates:python-central
/var/lib/dpkg/triggers/ispell-autobuildhash:dictionaries-common
/var/lib/dpkg/triggers/pysupport:python-support
/var/lib/dpkg/triggers/update-ca-certificates:ca-certificates
/var/lib/dpkg/triggers/update-ca-certificates-fresh:ca-certificates
/var/lib/dpkg/triggers/update-default-ispell:dictionaries-common
/var/lib/dpkg/triggers/update-default-wordlist:dictionaries-common
/var/lib/dpkg/triggers/update-initramfs:initramfs-tools
Der Name der Datei scheint der Name des entsprechenden Befehls,
die Datei enthält den Name des entsprechenden Paketes.
(zumindest in einigen Fällen)
Der entsprechende Aufruf (in diesem Fall ein Skript mit den Restart-Befehlen für die sekundären Prozesse)
müßte dann im PATH verfügbar sein,
/usr/local/sbin/ / /usr/local/bin/ dürften wohl funktionieren.

/var/lib/dpkg/triggers/service-sekundaer-shairport:

Code: Alles auswählen

shairport
(falls es ein solches Paket gibt)
/usr/local/sbin/service-sekundaer-shairport:

Code: Alles auswählen

#!/bin/sh

SERVICE=shairport

for i in /etc/init.d/${SERVICE}??; do
    [ -x "$i" ] || continue
    "$i" status && "$i" restart
done
Evtl. noch /var/lib/dpkg/info/shairport.triggers:

Code: Alles auswählen

interest service-sekundaer-shairport
Ob es überhaupt funktioniert und die Dienste im richtigen Moment neugestartet würden,
ist auszuprobieren.
(Scheint so, als ob das im postinst doch explizit verwendet werden muß, statt ein automatischer Mechanismus zu sein)

(Bei mir laß ich das jetzt mal für mehrere Instanzen vsftpd laufen
(Bei dem ist auch einiges im Init-Skript anzupassen, zBsp. viele "hardcodierte" Aufrufe durch Variable zu ersetzen,
Konf-Dateien, pam-Dateien, unterschiedliche Benutzer/Homes))
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

Antworten