Schrift
[thread]8368[/thread]

daemon killen

Leser: 1


<< |< 1 2 >| >> 11 Einträge, 2 Seiten
Froschpopo
 2006-09-27 23:12
#70339 #70339
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
wie killt ihr eigentlich einen benutzerfreundlichen daemon?

ich hab nen script gebaut, welches in der shell mit "getdaemon.pl start" den daemin startet. Es handelt sich dabei um einen server.

damit ich den server später mit "getdaemon.pl stop" beenden konnte, hab ich die PID in eine temporäre textdatei ausgelagert.

Ist das so üblich? Oder hab ich mal wieder einen völlig unnötigen Weg gewählt den man anders viel einfacher beschreiten könnte?
Fand das aber trotzdem noch einfacher, als die prozesstabelle von suse nach meinem prog zu durchsuchen.
wie macht ihr das denn so?\n\n

<!--EDIT|Froschpopo|1159384429-->
sid burn
 2006-09-27 23:27
#70340 #70340
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Ja das auslagern der PID in eine Textdatei ist so üblich. Ich würde die PID aber auch in das entsprechende Verzeichnis Speichern wo es üblich ist. Bei Debian z.B. /var/run

Ansonsten startet man die Server auch üblicherweise z.B. über Bash Skripte. Und das beenden macht man üblicherweise auch über Bash Skripte.

Debian hat zur Vereinfachung den befehl "start-stop-daemon", bei Red Hat und Suse sind die Befehle anders. Ich glaube sogar nur "start" oder "daemon" oder so. Du kannst aber auch alles Manuell Regeln.

Ein Daemon beendet man üblicherweise indem man ihm ein SIGNAL schickt. Mir ist aber gerade eben entfallen welches Signal geschictk wird wenn man einfach nur "kill 12345" eintippt. Es sollte aber aufjedenfall gut sein wenn du "SIGQUIT", "SIGINT", und "SIGTERM" abfängst.

Das abfangen kannst du dann z.B. über "$SIG{TERM} = \&quit" machen. Das heißt wenn ein SIGTERM Signal eintrifft wird die quit Funktion aufgerufen, die dann noch abschließend zusätzlich etwas ausführen kann. z.B. Datenbankverbindung schließen, Temp Dateien löschen etc. Halt alles beseitigen zum Aufräumen.

Wohin das Bashskript sein Signal schickt, also zur welcher PID liest es halt aus der PID Datei aus. Dein Vorgehen ist also üblich.\n\n

<!--EDIT|sid burn|1159385418-->
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
topeg
 2006-09-28 00:49
#70341 #70341
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Das normale Signal ist "QUIT". Es sagt dem Programm sich normal zu beenden, die letzten Aktionen aus zu führen, Sicherrungen vor zu nehmen und alle belegten Resourcen (Netzwerkverbindungen, offenen Dateien, belegter Speicher etc.) frei zu geben.
"TERM" soll dafür sorgen, daß das Programm sofort beendet wird, allso keinerlei Sicherungen, oder sonstige Aktionen ausführt. Nur alle Resourcen sind, wenn möglich, frei zu geben.
docsnyder
 2006-09-28 10:41
#70342 #70342
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
Du solltest auch auf SIGHUP reagieren.

Gruß, Doc
nepos
 2006-09-28 11:26
#70343 #70343
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
@topeg:Ich dachte, das was du beschreibst ist bei SIGKILL der Fall?
Dubu
 2006-09-28 15:09
#70344 #70344
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
[quote=topeg,27.09.2006, 22:49]Das normale Signal ist "QUIT". Es sagt dem Programm sich normal zu beenden, die letzten Aktionen aus zu führen, Sicherrungen vor zu nehmen und alle belegten Resourcen (Netzwerkverbindungen, offenen Dateien, belegter Speicher etc.) frei zu geben.
[/quote]
Eigentlich nicht. Ein SIGQUIT wird normalerweise nur für's Debugging benutzt, weil damit nicht nur der Prozess beendet wird, sondern auch (vorbehaltlich anderer ulimit-Einstellungen) ein core-File erzeugt. In der Shell kann ein SIGQUIT durch Ctrl-\ erzeugt werden.

Was du beschreibst, trifft eher auf SIGTERM (s.u.) oder SIGINT zu.

Allerdings muss nur ein SIGTERM zwingend zu einem Abbruch des Programms führen, ein SIGINT (in der Shell meist mit Ctrl-C ausgelöst) bewirkt zwar in den meisten Fällen ebenfalls einen kontrollierten Programmabbruch, ein Programm darf darauf aber auch anders reagieren. Da ein SIGINT normalerweise von einer interaktiven Shell ausgeführt wird, kann ein Programm beispielsweise nachfragen, ob wirklich abgebrochen werden soll.

Quote
"TERM" soll dafür sorgen, daß das Programm sofort beendet wird, allso keinerlei Sicherungen, oder sonstige Aktionen ausführt. Nur alle Resourcen sind, wenn möglich, frei zu geben.

Was du hier beschreibst, ist - wie nepos schon schrieb - SIGKILL. Ein SIGKILL führt zum sofortigen Programmabbruch und kann nicht im Programm abgefangen werden.

SIGTERM ist im Gegenteil die "schonendste" Methode, einen Prozess zu beenden. Es ist das Default-Signal von kill(1), d.h. wenn man bei "kill <pid>" kein Signal angibt, wird ein SIGTERM an den Prozess geschickt.

Also kurz gefasst:
SIGINT: Ctrl-C, meist kontrollierter Programmabbruch
SIGTERM: Default für kill(1), kontrollierter Programmabbruch
SIGQUIT: Ctrl-\, kontrollierter Programmabbruch mit Coredump
SIGKILL: "kill -9", nicht-kontrollierbarer Programmabbruch

Die englische Wikipedia hat eine ganz gute Übersicht mit Artikeln zu den wichtigsten Signalen.
Crian
 2006-09-28 15:54
#70345 #70345
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
dubu++
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Froschpopo
 2006-09-29 02:33
#70346 #70346
User since
2003-08-15
2653 Artikel
BenutzerIn
[default_avatar]
kann man den Strg-c auch noch irgendwie abfangen? So dass man z.b. vorher schnell in ein file cachen kann. welches signal gibts eigentlich bei einem kill?
docsnyder
 2006-09-29 10:30
#70347 #70347
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
@froschpopo

Quote
kann man den Strg-c auch noch irgendwie abfangen? So dass man z.b. vorher schnell in ein file cachen kann.

Nein, siehe oben ...

Quote
welches signal gibts eigentlich bei einem kill?

SIGTERM, sie oben ...

Gruß, Doc
pq
 2006-09-29 13:05
#70348 #70348
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=docsnyder,29.09.2006, 08:30]
Quote
kann man den Strg-c auch noch irgendwie abfangen? So dass man z.b. vorher schnell in ein file cachen kann.

Nein, siehe oben ...[/quote]
klar kann man.
CTRL-C schickt ein sigint, zumindest auf meinem rechner.
$SIG{INT}\n\n

<!--EDIT|pq|1159520779-->
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2006-09-27 23:12.