2008-10-09 13 views
52

Próbuję napisać demona Mono C# dla systemu Linux.Jak kodować demona Mono

Chciałbym zrobić start i zatrzymać go, gdy zakończy się przetwarzanie, a nie tylko zabicie procesu.

Czy ktoś ma przykłady tego?

Edycja: wymyśliłem, jak używać start-stop-daemon --background w debian, więc myślę, że po prostu użyję tego na teraz.

Edycja: Wdrażam to również w java i mają one ładny addShutdownHook, który przerywa zamykanie aplikacji. Muszę poświęcić trochę więcej czasu na sortowanie zależności dla usługi mono lub znaleźć sposób na zakończenie aplikacji.

Istnieje zdarzenie SessionEnd, ale to jest dostępne tylko dla usług, a nie pocieszać aplikacje

Odpowiedź: using mono-service to wrap a windows service on linux

+0

ja też naprawdę kochać, aby zobaczyć co odpowiedź jest do tego, szukałem bezskutecznie kilka miesięcy temu. –

+0

Jednorazowe wykorzystanie starego kolekcjonera Garbade, który jest przeciekiem w moim 2.10 na debian. Używam crona w połączeniu z mono-sgen. – ikutsin

Odpowiedz

19

Powinieneś wdrożyć usługę i korzystać z usługi monofonicznej. Google za to i znajdziesz kilka przykładów.

+0

brzmi jak dobre rozwiązanie, wypróbuję to –

+17

Jeśli przykłady są łatwe do znalezienia, proszę je połączyć tutaj. Odniesienie do Google jest z czasem dość niestabilne. – fbmd

+0

Zauważyłem, że łatwiej jest napisać aplikację konsolową, ponieważ wtedy jest trywialne uruchomienie aplikacji w tle w Linuksie - co czyni ją "demonem". – markmnl

16

Prostym sposobem byłoby słuchać na (wysokie lokalnym) porcie i otrzymywać polecenia od klienta zarządzającego, tak jak robi to bind.

Bardziej unixowym sposobem byłoby register a signal handler użycie i prawidłowe zamknięcie po otrzymaniu określonego sygnału. Zobacz Mono FAQ, "Can I use signal handlers with Mono?", aby poznać zastrzeżenia i przykład.

lupus znalazła mono-service, który jest proces hostingu przy użyciu interfejsów ServiceProcess. Niestety wymaga to ustawienia MONO_DISABLE_SHM, która wyłącza niektóre funkcje Mono, w szczególności systemy ICC z procesami krzyżowymi.

+0

Powinieneś być w porządku z brakiem IPC –

4

Demon pod Linuksem zazwyczaj nasłuchuje sygnałów, takich jak sygnał zabicia, ale są też inne, które pozwalają mu na takie operacje, jak miękki restart (odczytuje konfigurację) i tak dalej.

Zazwyczaj towarzyszy temu skrypt w katalogu /etc/init.d, który kontroluje uruchamianie i zatrzymywanie takich demonów. Zazwyczaj plik pid jest tworzony w/var/run, który zachowuje identyfikator procesu dla skryptu, aby szybko zidentyfikować proces.

Nawet w przypadku kodowania Mono dobrze zrozumiesz środowisko, w którym kodujesz, ponieważ nie ma różnicy między procesem Mono lub rodzimym (na przykład utworzonym w C) lub skryptem.

Dave

0

Miguel de Icaza niedawno pisał o nowej Mono C# interactive shell że powinieneś móc daemonize dość łatwo. Miguel ma kod follow-up article z kodem źródłowym, który pokazuje, w jaki sposób można dołączyć powłokę interaktywną do innych aplikacji C#. Może służyć jako dobry punkt wyjścia dla twojego demona.

Należy zauważyć, że powłoka interaktywna wymaga wersji Mono 2.2, która nie została jeszcze wydana. Kod jest dostępny pod numerem Mono's svn repository.

+0

ciekawy sposób to zrobić, wkładam to do produkcji, więc używam tylko wydanych wersji mono. –

0

David ma rację, zatrzymanie usługi odbywa się poprzez sygnał UNIX i powinieneś użyć funkcji obsługi sygnału, aby ją złapać.

25

Aby otrzymywać powiadomienia w sposób uniksowy, tj. Za pomocą sygnałów, chcesz użyć Mono.Unix.UnixSignal dla każdego sygnału, który planujesz otrzymywać, a następnie wywoływać UnixSignal.WaitAny() na tablicy sygnałów.


Zazwyczaj robisz to w oddzielnym wątku.

0

Alternatywnie używam skryptu powłoki. Zaczyna się moja aplikacja mono, a kiedy moja aplikacja zostanie zamknięta (celowo lub nieumyślnie), obejrzy wszystkie sygnały zwrotne, które ustawiła moja aplikacja. Może to być używane do instruowania skryptu do kopiowania w aktualizacji, restartowania lub zamykania. Jeśli moja aplikacja ulegnie awarii, sygnał nie zostanie zwrócony, więc skrypt uruchomi ponownie moją aplikację i wyśle ​​do mnie e-mail z kilkoma ostatnimi liniami wyjścia konsoli.

Zobacz Windows like services development in LINUX using MONO?