Zarządzanie zewnętrznymi procesami

0

Cześć,
potrzebuję podpowiedzi pod kątem zarządzania innymi procesami.
Problem polega na tym, że chciałbym na zlecenie jedną aplikacją tworzyć sobie x-execów, które by sobie coś tam liczyły. Te execi meldowałyby się ( prawdopodobnie na bazie danych ), że żyją i mają się dobrze. Natomiast, jeżeli jeden z tych execów "nie zamelduje się" w porę, to chciałbym po pid ubijać takiego.

Pytanie moje, na jakim zagadnieniu skupić uwagę, gdzie, a bardziej co może, doczytać, aby sobie to zgrabnie zrobić.

3

boost::process tak defaultowo na początek chyba?
Ew. platform-specific API. Jaki system?

0

Windows, ale chyba nie chciałbym ograniczać się w ten sposób

1

Samo uruchomienie osobnych procesów możesz zrealizować z https://en.cppreference.com/w/cpp/utility/program/system przekazując dane do liczenia jako parametr wywołania.

Te execi meldowałyby się ( prawdopodobnie na bazie danych ), że żyją i mają się dobrze

IPC jest do zrealizowania na wiele sposobów, wszystko zależy czy chcesz jakieś zewnętrzne biblioteki, czy wolisz to zrobić "na lekko", czy chcesz przenośnie czy nie. Można to zrobić na zasadzie lokalnej komunikacji sieciowej gdzie proces matka pełni rolę serwera, startując proces-dziecko jednym z parametrów byłby port na który ten proces ma się zgłaszać. Jest to do ogarnięcia bez bibliotek z użyciem interfejsu socketowego, którego użycie jest niemal identyczne na windowsie i linuksie a różni się głównie nazwami nagłówków i koniecznością wywołania procedury startowej na windowsie.

Zamiast socketów możesz użyć google protbuffs, albo jakąś bibliotekę do RPC. Zamiast podejścia sieciowego możesz to też zrealizować poprzez pamięć współdzieloną https://www.boost.org/doc/libs/1_54_0/doc/html/interprocess/sharedmemorybetweenprocesses.html, Możesz też użyć jakiegoś natywnego podejścia dla danego OS np. COM dla windowsa i D-Bus dla linuksa - do wyboru do koloru.

0

Właśnie chcę to zrobić możliwie jak najlżej. W sensie, nie chciałbym, aby proces-matka obserwował bezpośrednio stan procesów-dzieci, zwłaszcza, że uznajemy, że baza jest źródłem prawdy. Wolałbym, aby proces-matka miał tylko obserwację, czy proces-dziecko żyje i ubijał bez refleksji, te które padły. Można założyć, że w skrajnym przypadku taki proces-matka miałby położyć nawet serwis.

0
BartoSAS napisał(a):

Właśnie chcę to zrobić możliwie jak najlżej.

To na 100% nie przez bazę danych. Najlżej to http serwer na localhost.

0

Baza musi być :'(

3

qt -> qprocess
tam tworzysz proces i możesz go obserwować jak sam się z jakiegoś powodu wyłączy to cie o tym poinformuje podobnie z błędami z stderr itp. O ile pamiętam(z tego akurat nie korzystam) bezpośrdnio przez qprocess i towarzyszące klasy można coś wysłać do takiego procesu.
Co do bazy to zły pomysł. Jak to wymaganie biznesowe to zgłoś że to zły pomysł. Ewentualnie jak chcą to tylko zgłaszanie przez aplikację matkę kiedy wystartowano proces i kiedy sie zakończył cyk do tej bazy. A nie jakieś IPC.
podsumowanie: Qt daje to co potrzebujesz do zarządzania procesami.

0

Qt, chciałbym, nie mogę - też używałem w innych projektach QProcess.
Właśnie teraz tak jest, że jest zrobione na pamięci współdzielonej, jednocześnie proces-matka zgłasza do bazy, czy żyją procesy-dzieci. Problemy jakieś tam się pojawiły, bo robiony był CDD (Cv Driven Development) i nie ma chętnych, by to poruszyć :/

1

to po staremu jak w przemyśle life bit. Nie zmienia się jedna zmienna to ubić proces. Takie coś chyba kiedyś na linuchu chciałem robić używając podstawowych narzędzi ale na czym to stanęło nie pamiętam. Możesz się skupić na boost on i ma robienie procesów i ipc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1