Wieso wird Port blockiert

  • Hi,


    ich hab nen Problem, bei dem ich verstehen möchte, wieso dies auftritt. Ich suche also keine Alternativ Vorschläge, sondern den Grund.
    Folgendes passiert: Wenn ich aus dem VDR OSD heraus ein Script starte, welches den VDR stoppt, ein paar Sekunden wartet und dann den VDR wieder startet, ist anschließend der SVDRPSEND Port blockiert (und auch alle anderen Ports die der VDR geöffnet hatte), der neue VDR kann also nicht mehr auf diesem Port lauschen. Das Script das dies durchführt, wird im Hintergrund ausgeführt.
    Hier ein vereinfachtes Beispiel dessen, was ich aus dem VDR heraus aufrufe:

    Bash
    #!/bin/sh
    
    
    {
      sleep 1
      killall runvdr
      killall vdr
      sleep 5
      runvdr
    } &>/dev/null </dev/null &


    Kann mir jemand erklären, wieso das so nicht geht?
    Führe ich das Script auf der Kommandozeile aus, funktioniert es.


    Claus

    MLD 5.5 mit vdr 2.6 - lirc yaUSBir - Octopus NET S2 - SCR - XFX GeForce 9300 mit Intel E3200 - 2GB RAM - WD Green 12TB HDD - SanDisk 64GB SSD - Lian Li PC-C37B - Samsung LE40A559
    MLD 5.5 mit vdr 2.4 - Raspberry Pi 3 - rpihddevice
    MLD 5.5 mit Squeeze Play - Raspberry Pi 2 - 32GB SD - 7" Touch TFT

  • Bin da kein Spezialist, aber nach dem VDR Start dauert es immer ein wenig Zeit bis "svdrp" zur Verfügung steht. Warum auch immer, könnten aber evtl. Plugins im Allgemeinen sein. "svdrp" kann immer nur ein Befehl annehmen und keinen Zweiten, bis der vorherige komplett ausgeführt wurde, das sieht dann in der Tat so aus, als ob der VDR nicht auf den svdrp-Port hört ...


    Regards
    fnu

    HowTo: APT pinning

  • Wird denn der alte VDR-Prozess überhaupt beendet? Wie rufst du das Skript auf (commands.conf, menuorg, andere Methode)? Passiert das auch, wenn du es mit Hilfe von nohup oder at startest?

    yaVDR-Dokumentation (Ceterum censeo enchiridia esse lectitanda.)

  • oder mal mit lsof -i schauen ob auf dem Port noch wer "listened" bevor DU den vdr wieder startest.

    Zum Guggen: yavdr0.6 + Silverstone GD04 + Intel DH57DD + Intel G6950 + Nvidia GT630 + Unicable/Jess-Sat (JPS0501-12) mit DD/L4M Max8 + 4TB WD-red + bequiet SFX300W
    Zum Testen : yavdr-Ansible + GMC Toast + B365M+i3-8100+ Nvidia GT1030 + L4M CineS2v6 o. SAT>IP Plugin mit DD-O'net
    VaaS (VDR-as-a-Service): yavdr06 + ML03+DH67BL+G530+2GB RAM + 2TB WD-EARX + Zotac GT610 + L4M v5.4 + bequiet SFX300W
    Squeezeboxserver: DN2800ML im Streacom F1CS NAS: HP ProLiant MicroServer NL36+ Smart Array P212

  • Ja, der VDR Eltern Prozess wird beendet.


    Aber ich hab inzwischen nen Tipp von nem Kollegen bekommen, und da ist's mir auch wieder eingefallen.
    Wenn ein Prozess einen Child Prozess Startet (forkt), erbt der Child Prozess auch alle Filehandler vom Eltern Prozess. In meinem Fall erbt das Shell Script also auch den Filehandler zum offenen Port. Wenn nun das Script den VDR Startet, erbt auch dieser wieder alle Filehandler inklusive des offenen Ports, wodurch der Port dann nicht erneut geöffnet werden kann, weil der ja noch offen ist. Der Ursprüngliche VDR Prozess kann beim beenden den Port nicht zumachen, weil der ja zuvor an das Shell Script weitergegeben wurde, und dieses ja noch läuft.
    Wenn man innerhalb eines C Programms nen Fork durchführt, ist es üblich als erstes alle nicht benötigten Filehandler zu schließen.
    Ich muss nun also nur noch herausfinden, wie ich ein Shell Script veranlasse alle geerbten Filehandler zu schließen, bevor ich den VDR erneut starte. Das müsste es eigentlich als Buildin Funktion der Shell geben.


    Claus

    MLD 5.5 mit vdr 2.6 - lirc yaUSBir - Octopus NET S2 - SCR - XFX GeForce 9300 mit Intel E3200 - 2GB RAM - WD Green 12TB HDD - SanDisk 64GB SSD - Lian Li PC-C37B - Samsung LE40A559
    MLD 5.5 mit vdr 2.4 - Raspberry Pi 3 - rpihddevice
    MLD 5.5 mit Squeeze Play - Raspberry Pi 2 - 32GB SD - 7" Touch TFT

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!