Re: Checken, ob ein (Perl-)Skript schon läuft
On Sat, Apr 21, 2012 at 02:02:55AM +0200, David Haller wrote:
> Hallo,
>
> Am Sat, 21 Apr 2012, Ulf Volmer schrieb:
> >On Sat, Apr 21, 2012 at 12:57:30AM +0200, Andre Tann wrote:
> >> ich möchte gerne innerhalb eines (Perl-)Skriptes prüfen, ob dieses
> >> Skript schon anderweitig gestartet wurde. Wenn das nikcht der Fall ist,
> >> dann soll das Skript weiterlaufen, sonst soll es sich beenden.
> >>
> >> Überlegt habe ich, die Prozesstabelle nach dem Skriptnamen zu
> >> durchsuchen, etwa
> >>
> >> ps a | grep /pfad/zum/skrip[t]
> >>
> >> Das ist aus vielerlei Gründen blöd.
> >
> >Die IMHO einzig saubere Lösung ist es, es so zu machen, wie andere Daemons
> >es auch machen, pid- File erzeugen und auf dessen Existenz prüfen.
>
> Unnötig. Und die Existenz allein ist, öhm, bestenfalls notwendig, aber
> nicht hinreichend.
Man muß auch die PID noch prüfen, ja.
> Perl-Scripte werden immer von perl ausgeführt. Ich hab z.B. ein
> ~/bin/dhweather. Führe ich das als 'dhweather' aus, findet sich in
> der Ausgabe von 'ps x':
>
> /usr/bin/perl -ws /home/dh/bin/dhweather
Oder
/usr/bin/perl -ws ./dhweather
/usr/bin/perl -ws ./bin/dhweather
Oder wie auch immer Du das Script aufrufst. Darauf wollte Andre hinaus.
> als Command. Ein
>
> ps ax | grep 'bin/[p]erl.*${SCRIPTNAME}'
Damit muß dann der Scriptname im System eindeutig sein, unabhängig vom
Pfad. Oder auch vom User. Das empfinde ich als unsauber.
Vom bösen Mitnutzer, der seinen Prozessnamem einfach auf
'/usr/bin/perl -ws /home/dh/bin/dhweather' setzt, möchte ich ja gar nicht
erst anfangen... :)
> sollte also ein laufendes Script finden. Um sicherzugehen könnte man
> im perl-script /proc/$$/cmdline einlesen und irgendwo loggen, z.B.:
Schon besser. Troztdem finde ich PID- Files erheblich eleganter.
> Generell sind PID/Lockfiles natürlich sinnvoll. Unter SUSE gibt's
> dafür z.B. start-/check-/killproc wo man ein PID-File angeben
> kann. Anderswo sollte es sowas auch geben (deamon ...?) oder halt
> ggfs. die deamontools oder so. Oder man macht's im Script selber.
Unter Debian gibt es da start_daemon/killproc u.a.
Siehe /lib/lsb/init-functions.
Gruß,
Ulf.
Reply to: