Reboot + Service -> C++ -> child-process lifetime



  • Hey. Ich habe relativ wenig Ahnung von Linux und deshalb fehlt mir das verständnis, woran mein Problem liegen könnte. Ich wäre schon mit einigen Schlagworten oder lieblos hingeworfenen Links zufrieden^^

    Kurzfassung: Ich erstelle mit system( " X &" ) prozesse und die sterben ca. 90 sekunden nachdem mein programm beendet worden ist.

    Längere Erklärung mit Code:
    Ich habe ein Programm, was mir config-Werte aus ner Datenbank holt und dann die entsprechenden Konfigurations-Dateien bearbeitet und danach ein paar Programme starten soll. So weit so gut:

    // /etc/systemd/system/NAME.service
    
    [Unit]
    Description=Y
    After=mariadb.service
    
    [Service]
    Type=oneshot
    ExecStart=/var/cpp/x/main
    
    [Install]
    WantedBy=multi-user.target
    

    aktiviert mit "sudo systemctl daemon-reload && sudo systemctl enable NAME"

    // /var/cpp/x/main
    
    #include <cstdio>
    
    int main()
    { //pseudocode
      auto param = DB_CONFIG["A"];
      schreibe_config( param );
      restart( irgendwas );
      std::system( "sudo /var/cpp/Z/main " + param + " &" );
      //std::system( "sudo /var/cpp/ABCD/main" );
    }
    //falls wichtig: das ding hier ist nach paar sekunden fertig
    
    
    // /var/cpp/Z/main
    #include <unistd.h>
    
    int main( int argc, char* argv[] )
    {
      //wichtig, dass hier argv[1] = param von oben (x/main) ist!
      for( ;; )
      {
        sleep( 2 );
      }
    }
    
    

    Gestartet wird alles, aber nach vielleicht einer Minute sind alle per system gestarteten prozesse tot.
    Wenn ich auf der command-line im ssh x/main ausführe läuft alles bestens. (Nachtrag: Das heißt, dass die Prozesse werden dann nicht beendet werden sondern (wie gedacht) ewig laufen.)
    Insgesamt starte ich 4 Programme und restarte einen "richtigen" Service (hostapd). Der Dienst läuft immer durch. Die 4 Programme sterben zeitgleich nach ca. 90 Sekunden.
    Das sagt mir ein PHP-Script, was dazu exec und /bin/pidof nutzt.

    Wieso Z kein eigener dienst sein soll: Kann er gern sein, allerdings weiß ich nicht, wie ich die sache mit "param" dann anstellen sollte.

    Vielen Dank im Voraus



  • ja man startet mit system auch keine prozesse (eigentlich benutzt man überhaupt kein system).

    aber wie wäre es denn damit, das programm so lange laufen zu lassen, bis der prozess beendet wurde? schlagwörter: fork, exec, waitpid. edit: evtl. weitere schlagwörter: pipe, dup2, read, write.



  • "system böse"
    Mir schon klar, dass man das nicht tut. Deshalb habe ich es extra erwähnt. Wenn das Problem nur dort liegt, ists ja gut. Aber ich habe wenig Lust, jetzt mit exec und fork rumzufrickeln, um später zu merken, dass ich das Problem ganz falsch angegangen bin.

    "aber wie wäre es denn damit, das programm so lange laufen zu lassen, bis der prozess beendet wurde"
    Das finde ich persönlich noch hässlicher als system (Laufzeit einige Sekunden vs. 24/7) - aber weil ich das nicht einschätzen kann, wollte ich jemanden fragen, der sich damit auskennt... ^^



  • wie du findest das noch hässlicher? wo ist denn das problem, einen prozess laufen zu haben, der einen anderen ansteuert? und exec und fork sind ja kein rumfrickeln, sondern der gängige weg.



  • Naja - es hindert mich eben daran, executables auszutauschen ohne alles zu stoppen.
    hab aber gerade doch noch was CreateProcess-ähnliches gefunden: posix_spawn.
    oder ist das unklug?

    edit:
    ok; ich bekomm wohl keine nicht-kind-prozesse erzeugt.

    dann nehm ich halt fork/exec und leb damit, dass alles beendet wird, wenn der config-leser-prozess beendet wird.

    danke! : )



  • Der Elternprozess wird erst nach dem Kindprozess beendet. Du musst da nicht mit leben, dass da alles beendet wird.



  • @Wade1234 sagte in Reboot + Service -> C++ -> child-process lifetime:

    Du musst da nicht mit leben, dass da alles beendet wird.

    Na doch: Wenn ich den config_reader (mein X von oben) beenden möchte (weil ich ihn durch ne neue Version ersetzen möchte), werden logischerweise alle Kindprozesse ebenso gekillt. Das ist natürlich nicht ganz so klasse. Auch kann ich ihn nicht manuell starten, wenn ich der Meinung bin, dass sich was geändert hat; weil er ja noch läuft^^

    Hab wegen der vielen Nachteile noch mal über die Notwendigkeit des Syncs nachgedacht und hab die wegbekommen. (Muss mein Z von oben eben in ner config nachlesen, die X geschrieben hat.)
    Dann kann der Rest einfach auch nen Service sein und der config_reader restarted einfach all das, was notwendig ist.

    Jetzt gefällts mir.

    Danke für deine geduldige Hilfestellung 🙂



  • ja aber dann hast du da glaube ich was falsch strukturiert. du kannst ja quasi im hauptprogramm x als kindprozess erstellen und dann noch beliebig viele andere kindprozesse und die alle nach belieben neu starten, beenden, austauschen usw.



  • @Wade1234
    Jo; ich hätte eben nen expliziten Vaterprozess gebraucht, der nur genau das kann, was service schon kann: stoppen; starten; restarten; ... Der stoppt dann dienste, führt dann config_reader (bei bedarf) aus und startet die wieder.

    Das wollte ich nicht und habe jetzt 2 dienste:
    config_reader - type oneshot
    Z - type simple + restart

    config_reader macht das, was er soll und restartet danach dann Z (und die anderen richtigen dienste)


Log in to reply