2010-06-22 7 views
44

Piszę demona Linux. Znalazłem dwa sposoby, aby to zrobić.Linux daemonize

  1. Zeskanuj swój proces, dzwoniąc pod numer fork() i ustawiając sid.
  2. Uruchamianie programu za pomocą &.

Jaki jest właściwy sposób na zrobienie tego?

+1

Możesz użyć nohup: http://stackoverflow.com/questions/958249/whats-the-difference-between-nohup-anda-a-emonem – rogerdpack

Odpowiedz

76

Od http://www.steve.org.uk/Reference/Unix/faq_2.html#SEC16

Oto kroki, aby stać się demonem:

  1. fork(), więc rodzic może wyjść, to sterowanie powraca do linii poleceń lub powłoce powołuje swój program. Ten krok jest wymagany, aby zagwarantować, że nowy proces nie będzie liderem grupy procesów. Następny krok, setsid(), nie powiedzie się, jeśli jesteś liderem grupy procesów.
  2. setsid(), aby stać się grupą procesów i liderem grupy sesji. Ponieważ terminal sterujący jest powiązany z sesją, a ta nowa sesja nie uzyskała jeszcze terminala sterującego, nasz proces nie ma teraz terminalu sterującego, co jest Dobrą Rzeczą dla demonów.
  3. fork() ponownie, aby rodzic (lider grupy sesji) mógł wyjść. Oznacza to, że jako lider grupy, która nie jest sesją, nie możemy odzyskać kontrolnego terminalu.
  4. chdir ("/"), aby zapewnić, że nasz proces nie zachowuje żadnego katalogu w użyciu. Niewykonanie tej czynności może spowodować, że administrator nie będzie mógł odmontować systemu plików, ponieważ był to nasz obecny katalog. [Równoważnie, możemy przejść do dowolnego katalogu zawierającego pliki ważne dla działania demona.]
  5. umask (0), abyśmy mieli pełną kontrolę nad uprawnieniami wszystkiego, co napiszemy. Nie wiemy, co umask moglibyśmy odziedziczyć. [Ten krok jest opcjonalny]
  6. close() fds 0, 1 i 2. To powoduje zwolnienie standardu wejścia i wyjścia oraz błędu odziedziczonego po procesie nadrzędnym. Nie wiemy, do kogo te bzdury mogły zostać przekierowane. Zauważ, że wiele demonów używa sysconf() do określenia limitu _SC_OPEN_MAX. _SC_OPEN_MAX mówi ci o maksymalnych otwartych plikach/procesie. Następnie, w pętli, demon może zamknąć wszystkie możliwe deskryptory plików. Musisz zdecydować, czy musisz to zrobić, czy nie. Jeśli uważasz, że mogą być otwarte deskryptory plików, powinieneś je zamknąć, ponieważ istnieje ograniczenie liczby współbieżnych deskryptorów plików.
  7. Należy ustanowić nowe otwarte deskryptory dla stdin, stdout i stderr. Nawet jeśli nie planujesz ich używać, dobrym pomysłem jest ich otwarcie.Dokładne obchodzenie się z nimi jest kwestią gustu; jeśli masz plik logu, na przykład, możesz chcieć otworzyć go jako standardowe wyjście lub stderr i otworzyć "/ dev/null" jako stdin; alternatywnie, możesz otworzyć "/ dev/console" jako stderr i/lub stdout, a "/ dev/null" jako stdin, lub dowolną inną kombinację, która ma sens dla twojego demona.

Jeszcze lepiej, po prostu wywołać funkcję daemon() jeśli jest ona dostępna.

+1

musisz zamknąć wszystkie otwarte deskryptory. W przeciwnym razie pliki mogą nadal zawierać odwołanie, które na przykład uniemożliwi ich usunięcie. Jest to całkiem podobne do chdir ("/"). –

+2

@ n-alexanderso - czy daemon() podwójne widelce? – Dannyboy

+1

Dobry przykład w demey Ruby WEBrick (toggle source): http://ruby-doc.org/stdlib-2.1.1/libdoc/webrick/rdoc/WEBrick/Daemon.html –

2

Właściwie, aby zrobić demona, musisz podwoić widły.

Uruchomienie programu z & powoduje, że powłoka uruchamia program w tle, co nie czyni go demonem. Demony mają init (pid 1) jako rodzic, dlatego potrzebny jest podwójny fork.

Tak więc dobrym sposobem na zrobienie rzeczy, jeśli twój program jest demonem, byłoby zajęcie się tym problemem samemu (jest więcej metod, zobacz też here). Możesz także użyć programu start-stop-daemon.

5

Pierwsza. Drugi nie demonizuje, ale działa w tle. Daemonizowane programy powinny należeć do własnej grupy sesji i procesu, a powinny być , a nie mieć terminal sterujący.

+1

, ale nadal nie rozumiem, co jest przydatne w ustawianiu własnej sesji i grupa procesowa – Poorna

2

W jakim języku się posługujesz? Niektóre języki mają metody pomocnicze ułatwiające demonowanie. Na przykład Ruby ma pakiet daemons.

+0

używamy C++ – Poorna

11

Po prostu użyj daemon(3) (od unistd.h).

Funkcja daemon() jest przeznaczona dla programów które chcą odłączyć się od terminala sterującego w i działać w tle jako demony systemowe. ...

+0

Spędziłem kilka dni badając, w jaki sposób mogę uruchomić aplikację kolby jako demon na Ubuntu przy użyciu Jennkins, dopóki nie zobaczyłem twoich rad. Dziękuję Ci! Mój problem został rozwiązany za pomocą polecenia powłoki 'export BUILD_ID = dontKillMe' ' daemon flask run'' – barbarian

28

Sugeruję, aby w ogóle nie pisać swojego programu jako demona. Ustaw go na pierwszym planie przy pomocy deskryptorów plików, bieżącego katalogu, grupy procesów itd.

Jeśli chcesz uruchomić ten program jako demona, użyj start-stop-daemon (8), init (8), runsv (z runit), upstart, systemd lub cokolwiek, aby uruchomić proces jako demon . Oznacza to, że użytkownik powinien zdecydować, jak uruchomić program i nie wymuszać uruchomienia go jako demona.

+6

+1. Przynajmniej oferuj opcję uruchamiania na pierwszym planie. –

+0

Przepraszam, że przyniosłem starą odpowiedź, ale czy monit może również uruchomić proces jako demon? – allaire