pid bei mehreren Skript-Instanzen ermitteln

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Ozelot
Beiträge: 1515
Registriert: 18.11.2007 09:52:58

pid bei mehreren Skript-Instanzen ermitteln

Beitrag von Ozelot » 20.02.2011 14:10:19

Das ist wahrscheinlich Pipifax, aber ich und google finden den Weg nicht:

Ich will daß ein Skript sich beim Start gleich wieder beendet, wenn es feststellt, daß schon eine andere Instanz des Skriptes läuft.

Einfach mit grep in der prozessliste suchen ob der Skriptname aufttaucht geht nicht, weil es ja immer auch sich selbst findet.
Also brauche ich die pid des laufenden Skripts um sie mit den gefundenen zu vergleichen - wie kann ein Skript seine eigene pid ermitteln?

Zweitens brauche ich die pid der anderen Instanzen. Aber da gibt es folgendes Problem: Selbst wenn das Skript nur einmal gestartet wurde wird es als zwei verschiedene Prozesse angezeigt, was vielleicht an der Verwendung von Zenity liegt? pstree zeigt mir

Code: Alles auswählen

├─skript─┬─skript───sleep
         └─zenity
Deswegen bekomme ich aber mit pidoff keine Ausgabe, denn das gibt mir nur eine, wenn der abgefragte Name mit genau einem laufenden Programm übereinstimmt.

Also, wie macht man sowas richtig?

gxyz
Beiträge: 202
Registriert: 26.07.2010 13:54:21
Lizenz eigener Beiträge: MIT Lizenz

Re: pid bei mehreren Skript-Instanzen ermitteln

Beitrag von gxyz » 20.02.2011 14:54:50

Ozelot hat geschrieben: wie kann ein Skript seine eigene pid ermitteln?
... kommt darauf an, welche Art von Script, bei bash und Konsorten z.B. ueber die Variable "$$"
Ozelot hat geschrieben: Deswegen bekomme ich aber mit pidoff keine Ausgabe, denn das gibt mir nur eine, wenn der abgefragte Name mit genau einem laufenden Programm übereinstimmt.

Code: Alles auswählen

# man pidof:
[...]
       -x     Scripts  too  -  this  causes the program to also return process
              id's of shells running the named scripts.

       -o omitpid
              Tells pidof to omit processes with that process id. The  special
              pid  %PPID  can  be used to name the parent process of the pidof
              program, in other words the calling shell or shell script.

lemak
Beiträge: 1213
Registriert: 09.11.2007 13:25:57
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: pid bei mehreren Skript-Instanzen ermitteln

Beitrag von lemak » 20.02.2011 14:57:25

Ozelot hat geschrieben:Ich will daß ein Skript sich beim Start gleich wieder beendet, wenn es feststellt, daß schon eine andere Instanz des Skriptes läuft.
Also sicher weisst du besser was du machen willst, aber das oben genannte ginge auch ohne PID mit einer Lockfile

Code: Alles auswählen

#!/bin/sh
lockfile=/tmp/run_script # vllt auch "/tmp/`basename $0`"
if [ -e $lockfile ]; then
	echo "wird schon ausgeführt mit der pid `cat $lockfile`"
	exit
fi
echo $$ >$lockfile # pid hinterlegen und sperren
sleep 60
rm -f $lockfile # entsperren

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Re: pid bei mehreren Skript-Instanzen ermitteln

Beitrag von cosmac » 20.02.2011 16:03:55

hi,

nachdem eigens angelegte Lockfiles bei mir nie richtig funktioniert haben (z.B. werden sie nicht zuverlässig gelöscht), hab' ich mal probiert, das Script selbst als Lockfile zu verwenden. An den Anfang des Original-Scripts gehören dann diese Zeilen:

Code: Alles auswählen

#!/bin/sh

SCRIPT="/usr/local/bin/lock_test"   # das Script selbst inkl. Pfad
SWITCH="jetz_aber_wirklich"         # das Script ruft sich selbst auf und
                                    # erkennt hiermit internen Aufruf

if [ "$1" != "$SWITCH" ]; then
   flock --nonblock $SCRIPT $SCRIPT $SWITCH $*
   exit $?
fi

shift 1   # entfernt das "jetz_aber_wirklich", hier geht's dann mit dem
          # Original-Script und den Original-Parametern weiter
Beware of programmers who carry screwdrivers.

lemak
Beiträge: 1213
Registriert: 09.11.2007 13:25:57
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: pid bei mehreren Skript-Instanzen ermitteln

Beitrag von lemak » 20.02.2011 16:52:58

cosmac hat geschrieben:nachdem eigens angelegte Lockfiles bei mir nie richtig funktioniert haben (z.B. werden sie nicht zuverlässig gelöscht), hab' ich mal probiert, das Script selbst als Lockfile zu verwenden.
Wenn man komplexere Sachen macht, sollte man wohl zu flock greifen (kannt ich noch garnicht) oder mit einer eigenen Funktion statt exit arbeiten, die zuerst das lockfile löscht und dann erst das Skript mit exit beendet. Ein set -e geht dann auch nicht...
Und k.A. was noch alles :D

gxyz
Beiträge: 202
Registriert: 26.07.2010 13:54:21
Lizenz eigener Beiträge: MIT Lizenz

Re: pid bei mehreren Skript-Instanzen ermitteln

Beitrag von gxyz » 20.02.2011 17:16:39

i hat geschrieben:Wenn man komplexere Sachen macht, sollte man wohl zu flock greifen (kannt ich noch garnicht) oder mit einer eigenen Funktion statt exit arbeiten, die zuerst das lockfile löscht und dann erst das Skript mit exit beendet. Ein set -e geht dann auch nicht...
Und k.A. was noch alles :D
... halb so wild - der "klassische" Weg waere, einen Signalhandler zu installieren (In 'nem Shell-Script z.B. so 'was wie:
'trap "rm -f $LOCKFILE" 0 1 2 15') um dafuer zu sorgen dass nach Programmende aufgeraeumt wird. Fuer den Zweck um den's hier gehen soll, duerfte es trotzdem reichen, einfach nur, z.B. mit pidof, festzustellen, ob schon eine Instanz ausgefuehrt wird ...

Ozelot
Beiträge: 1515
Registriert: 18.11.2007 09:52:58

Re: pid bei mehreren Skript-Instanzen ermitteln

Beitrag von Ozelot » 21.02.2011 20:08:18

Ich denke, ja, für meine Zwecke reicht es, pidof richtig einzusetzen, was ich jetzt dank der Hinweise kann. Danke an Alle!

Die Idee mit einer Datei ("Lockfile" nennt man das also) hatte ich auch, aber fand das unelegant, denn falls das Skript unvorhergesehen (z.B. von Hand) beendet wird, kann man es danach nicht mehr starten.

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Re: pid bei mehreren Skript-Instanzen ermitteln

Beitrag von cosmac » 22.02.2011 00:29:37

Ozelot hat geschrieben:Die Idee mit einer Datei ("Lockfile" nennt man das also) hatte ich auch, aber fand das unelegant, denn falls das Skript unvorhergesehen (z.B. von Hand) beendet wird, kann man es danach nicht mehr starten.
mit flock(1) wär das nicht passiert -- das deutlich eleganter, weil das meiste vom Kernel erledigt wird.
Beware of programmers who carry screwdrivers.

Antworten