Perl daemon wird über init-d-script nicht beendet

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
petrolman
Beiträge: 42
Registriert: 20.05.2010 14:54:22

Perl daemon wird über init-d-script nicht beendet

Beitrag von petrolman » 10.08.2019 21:31:19

Hallo,
ich habe einen Perl daemon programmiert, der über ein init-d-script gestartet und beendet werden soll. Der Start funktioniert. Der Daemon läuft in einer Schleife. Wenn ich dann stop aufrufe, erhalte ich zwar die Meldung, dass der Daemon beendet wurde, jedoch läuft der Daemon weiter in der Schleife, weil die Bedingung für die Schleife immer noch wahr ist. Der Daemon wird erst beendet, wenn ich mir die Prozess-ID heraussuche und kill <process-id> aufrufe. Die Schleifenbedinung wird dann unwahr ($continue = 0). Das Skript verwendet Proc::Daemon, was ja die einfachste Variante sein soll.

Code: Alles auswählen

#!/usr/bin/perl -w

use strict;
use warnings;
use Proc::Daemon;

Proc::Daemon::Init;

my $continue = 1;
$SIG{TERM} = sub { $continue = 0 };

while ($continue) {
     #do stuff
}
Entsprechend der manpage (https://manpages.debian.org/buster/sysv ... .5.en.html) sieht init-d-Skript so aus. Die beiden überschreibbaren Funktionen do_start_prepare und do_stop_cleanup werden ausgeführt.

Code: Alles auswählen

#!/lib/init/init-d-script
### BEGIN INIT INFO
# Provides:          open door
# Required-Start:    $syslog $time $remote_fs
# Required-Stop:     $syslog $time $remote_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: My open door
# Description:       blabla
### END INIT INFO

DESC="OpenIP"
DAEMON=/usr/sbin/openip
NAME="openip"
PIDFILE="/var/run/$NAME/$NAME.pid"

. /etc/iptables-openip

do_start_prepare() 
{
  call setFirewallRules
}

do_stop_cleanup() 
{
  call deleteFirewallRules
}
PIDFILE wird nicht angelegt. In syslog bekomme ich zu sehen:

Code: Alles auswählen

Aug 10 21:18:53 mu2 systemd[1]: Starting LSB: Example initscript...
Aug 10 21:18:53 mu2 systemd[1]: Started LSB: Example initscript.
Aug 10 21:18:57 mu2 systemd[1]: Stopping LSB: Example initscript...
Aug 10 21:18:57 mu2 systemd[1]: openip.service: Succeeded.
Aug 10 21:18:57 mu2 systemd[1]: Stopped LSB: Example initscript.
Hier weiß ich nun nicht weiter. Jemand eine Idee, was hier los ist? Die Start und Stop Funktionen in /lib/init/init-d-script sind ja eindeutig.

Benutzeravatar
petrolman
Beiträge: 42
Registriert: 20.05.2010 14:54:22

Re: Perl daemon wird über init-d-script nicht beendet

Beitrag von petrolman » 11.08.2019 15:55:48

Ich hatte noch einmal lokal Debian 10 und Ubuntu Server installiert, um das zu testen. Der Perl Daemon wird einfach nicht über das init-d-script beendet. Deshalb habe ich nun die cleanup-Funktion ergänzt, um den Prozess doch noch beendet zu bekommen. Vielleicht bekomen die Verantwortlichen das ja mal irgendwann _zufällig_ wieder hin, dass es normal funktioniert.

Code: Alles auswählen

do_stop_cleanup()
{
  PID=0
  if pidof -x "openip" &>/dev/null
  then
    PID=`pidof -x "openip"`
  fi

  if [ 1 -lt $PID ]; then
    kill $PID
  fi

  call deleteFirewallRules
}
Was ja auch nicht mehr funktioniert, wenn man die Daemonisierung manuell zusammenstelle möchte.

Code: Alles auswählen

...
# daemonize
use POSIX qw(setsid);
chdir "/";
umask 0;
open (STDIN,  "</dev/null") or die "Can't read /dev/null: $!";
print "Hier1\n";
open (STDOUT, ">/dev/null") or die "Can't write to /dev/null: $!";
print "Hier2\n";
open (STDERR, ">/dev/null") or die "Can't write to /dev/null: $!";
defined( my $pid = fork ) or die "Can't fork: $!";
exit if $pid;
...
Die Ausgabe ist Hier1. Der Aufruf "open (STDOUT, ">/dev/null") or die "Can't write to /dev/null: $!";" beendet wortlos das Skript.

Antworten