W Linuksie chcę dodać demona, którego nie można zatrzymać i który monitoruje zmiany w systemie plików. Jeśli zostaną wykryte jakiekolwiek zmiany, powinien zapisać ścieżkę do konsoli, na której został uruchomiony, oraz znak nowej linii.
Mam już prawie gotowy kod zmieniający system plików, ale nie mogę wymyślić, jak utworzyć demona.
Mój kod pochodzi stąd: http://www.yolinux.com/TUTORIALS/ForkExecProcesses.html
Co robić po widelcu?
int main (int argc, char **argv) {
pid_t pID = fork();
if (pID == 0) { // child
// Code only executed by child process
sIdentifier = "Child Process: ";
}
else if (pID < 0) {
cerr << "Failed to fork" << endl;
exit(1);
// Throw exception
}
else // parent
{
// Code only executed by parent process
sIdentifier = "Parent Process:";
}
return 0;
}
inotify
API. Patrz:inotify_init
,inotify_add_watch
,inotify_rm_watch
.Odpowiedzi:
Demony działają w tle i (zwykle ...) nie należą do TTY, dlatego nie możesz używać stdout / stderr w sposób, w jaki prawdopodobnie chcesz. Zwykle demon syslog ( syslogd ) jest używany do logowania komunikatów do plików (debugowanie, błąd, ...).
Poza tym istnieje kilka wymaganych kroków, aby zdemonizować proces.
Jeśli dobrze pamiętam te kroki to:
Aby dać ci punkt wyjścia: spójrz na ten szkielet kodu, który przedstawia podstawowe kroki. Ten kod można teraz również rozwidlić na GitHub: Podstawowy szkielet demona linuxa
gcc -o firstdaemon daemonize.c
./firstdaemon
Sprawdź, czy wszystko działa poprawnie:
ps -xj | grep firstdaemon
Wynik powinien być podobny do tego:
Powinieneś tu zobaczyć:
(ze względu na drugi fork ())
Czytanie syslog:
/var/log/syslog
Zrób:
grep firstdaemon /var/log/syslog
Wynik powinien być podobny do tego:
Uwaga: W rzeczywistości chciałbyś również zaimplementować obsługę sygnału i poprawnie skonfigurować rejestrowanie (pliki, poziomy dziennika ...).
Dalsze czytanie:
źródło
fork()
, dlaczego po prostu nie użyćsetsid()
?sigaction()
sigaction()
signal()
man 7 daemon
opisuje szczegółowo, jak stworzyć demona. Moja odpowiedź to tylko fragment tej instrukcji.Istnieją co najmniej dwa typy demonów:
SysV Daemons
Jeśli interesuje Cię tradycyjny demon SysV , powinieneś zaimplementować następujące kroki :
Zwróć uwagę na to ostrzeżenie:
Zauważ, że
daemon()
nie jest to zgodne z POSIX .Demony w nowym stylu
W przypadku demonów nowego stylu zalecane są następujące kroki :
Aby dowiedzieć się więcej, przeczytaj całość
man 7 daemon
.źródło
W Linuksie nie można stworzyć procesu, którego nie można zabić. Użytkownik root (uid = 0) może wysłać sygnał do procesu, a są dwa sygnały, których nie można przechwycić, SIGKILL = 9, SIGSTOP = 19. Inne sygnały (jeśli nie zostaną złapane) również mogą spowodować zakończenie procesu.
Możesz potrzebować bardziej ogólnej funkcji daemonize, w której możesz określić nazwę swojego programu / demona i ścieżkę do uruchomienia programu (na przykład „/” lub „/ tmp”). Możesz również chcieć dostarczyć plik (i) dla stderr i stdout (i prawdopodobnie ścieżkę kontrolną za pomocą stdin).
Oto niezbędne obejmuje:
A oto bardziej ogólna funkcja,
Oto przykładowy program, który staje się demonem, kręci się w pobliżu, a następnie wychodzi.
Zauważ, że SIG_IGN wskazuje na złapanie i zignorowanie sygnału. Możesz zbudować procedurę obsługi sygnału, która może rejestrować odbiór sygnału i ustawiać flagi (takie jak flaga wskazująca bezpieczne zamknięcie).
źródło
Spróbuj użyć
daemon
funkcji:Od strony man :
źródło
daemon(7)
instrukcja wspomina o krokach tworzenia demona i ostrzega, że: Funkcja BSDdaemon()
nie powinna być używana, ponieważ implementuje tylko podzbiór tych kroków.daemon
funkcja pojawiła się po raz pierwszy w 4.4BSD i nie jest zgodna z POSIX .Mogę zatrzymać się na pierwszym wymaganiu „Demon, którego nie można zatrzymać ...”
Niemożliwe, przyjacielu; jednak możesz osiągnąć to samo dzięki znacznie lepszemu narzędziu, modułowi jądra.
http://www.infoq.com/articles/inotify-linux-file-system-event-monitoring
Wszystkie demony można zatrzymać. Niektórych łatwiej jest zatrzymać niż innych. Nawet para demonów z partnerem w przytrzymaniu, odradzająca partnera w przypadku utraty, może zostać zatrzymana. Musisz tylko trochę bardziej nad tym popracować.
źródło
Jeśli Twoja aplikacja jest jedną z:
i nie masz nic przeciwko zależności NodeJS, a następnie zainstaluj NodeJS, a następnie:
Aby wszystkie aplikacje działały po ponownym uruchomieniu (i demonizowaniu pm2):
Teraz możesz:
(pozwala również łatwo obserwować zmiany kodu w katalogu aplikacji i automatycznie ponownie uruchamiać proces aplikacji, gdy nastąpi zmiana kodu)
źródło
Wywołując fork () utworzyłeś proces potomny. Jeśli rozwidlenie zakończyło się pomyślnie (fork zwrócił niezerowy PID), wykonanie będzie kontynuowane od tego momentu z poziomu procesu potomnego. W tym przypadku chcemy wdzięcznie wyjść z procesu nadrzędnego, a następnie kontynuować naszą pracę w procesie potomnym.
Może to pomoże: http://www.netzmafia.de/skripten/unix/linux-daemon-howto.html
źródło
Demon to tylko proces w tle. Jeśli chcesz uruchomić program podczas uruchamiania systemu operacyjnego, w systemie Linux dodaj polecenie start do /etc/rc.d/rc.local (uruchom po wszystkich innych skryptach) lub /etc/startup.sh
W systemie Windows tworzysz usługę, rejestrujesz usługę, a następnie ustawiasz jej automatyczne uruchamianie przy starcie w panelu Administracja -> Usługi.
źródło
Szablon demona
Napisałem szablon demona podążając za daemonem w nowym stylu: link
Cały kod szablonu można znaleźć na GitHub: tutaj
Main.cpp
Daemon.hpp
Daemon.cpp
daemon-template.service
źródło