Forum: PC-Programmierung Python prüfen ob Script läuft


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Rüdiger (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo

Ich möchte vermeiden, dass ein Python Script mehr als einmal läuft. Wie 
kann ich kontrollieren, ob es bereits gesterten wurde?

von DEF (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Schreib ne Datei ins /tmp.

So fange ich auch Kernelexceptions im Toplevelscript ab,
wenn die Childs mal verrecken.

von Baku M. (baku)


Bewertung
0 lesenswert
nicht lesenswert
Windows oder Linux?

von Base64 U. (6964fcd710b8d77)


Bewertung
0 lesenswert
nicht lesenswert
lockfile/lockdir?

prozesse auf listen und schaun ob es da vorhanden ist?

von Baku M. (baku)


Bewertung
0 lesenswert
nicht lesenswert

von c-hater (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Rüdiger schrieb:

> Ich möchte vermeiden, dass ein Python Script mehr als einmal läuft. Wie
> kann ich kontrollieren, ob es bereits gesterten wurde?

Du musst selbst ein systemweites Objekt erzeugen, welches das möglich 
macht. Möglich macht es das, wenn für dieses systemweite Objekt ein 
IPC-Mechanismus existiert, der "erzeuge, wenn noch nicht vorhanden" 
realisiert und ein entsprechendes Ergebnis zurück gibt.

Es gibt sowohl unter Windows als auch unter Linux mehrere solcher 
IPC-Mechanismen. Die Wahl des am besten geeigneten hängt eigentlich nur 
davon ab, was das Script tun soll. Ist also dein Job, denn nur du kennst 
es...

So ist das mit der Salamitaktik: Das Ende der Wurst landet schnell 
wieder in der eigenen Fresse und man ist so schlau wie zuvor...

von test (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Unter Linux schaut man was für ein Init System (init.d, upstart usw.) 
von der Distribution genutzt wird und nutzt dann dieses.

lockfiles o.ä. haben das Problem dann sie bestehen bleiben wenn das 
Script gekillt.

von roks (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
test schrieb:
> lockfiles o.ä. haben das Problem dann sie bestehen bleiben wenn das
> Script gekillt.

Lockfile ins /tmp und das /tmp auf die RAM-Disk ...

von test (Gast)


Bewertung
1 lesenswert
nicht lesenswert
roks schrieb:
> test schrieb:
> lockfiles o.ä. haben das Problem dann sie bestehen bleiben wenn das
> Script gekillt.
>
> Lockfile ins /tmp und das /tmp auf die RAM-Disk ...

Und wenn das Scipt abstürzt bootet man den Rechner neu, so fürs echte 
Windows feeling ;-)

Die Linux Init Systeme bieten hier sehr viele Vorteile, es macht Sinn 
den eigenen Daemon (was das Script letztendlich ist) darüber 
einzubinden.

von DPA (Gast)


Bewertung
0 lesenswert
nicht lesenswert
test schrieb:
>> Lockfile ins /tmp und das /tmp auf die RAM-Disk ...
>
> Und wenn das Scipt abstürzt bootet man den Rechner neu, so fürs echte
> Windows feeling ;-)

Oder man löscht die Datei einfach. Gute bash Scripts setzen halt mit 
"trap" eine cleanup funktion. In C hat man signal handler. Bei python 
weiss ich jetzt nicht, da muss man halt schauen wie das Modul dafür, 
welches man nimmt, reagiert.

test schrieb:
> Die Linux Init Systeme bieten hier sehr viele Vorteile, es macht Sinn
> den eigenen Daemon (was das Script letztendlich ist) darüber
> einzubinden.

Das muss aber nicht zwangsläufig das init system übernehmen. Ins rc 
system passt es schon eher. Aber andere Tools & Hilfsprogramme können 
das auch, z.B. start-stop-daemon. Bei init scripts kann man auch einen 
Interpreter wählen, der das alles übernimmt, z.B. mein 
https://github.com/Daniel-Abrecht/unitscript, oder init-d-script in 
debian.

Man könnte auch lsof verwenden, dann darf man aber die inode nummer des 
Skripts nicht versehentlich ändern, während es läuft, und man kann dann 
halt wirklich nur eine Instanz haben. Würd ich aber nicht empfehlen:
1
#!/bin/bash
2
3
if lsof -F p "$0" | grep "p" | grep -vE "p$$" | grep -q .;
4
then
5
  echo "Already running!"
6
  exit 1
7
fi
8
9
echo "Started!"
10
sleep 4
11
echo "Stopped!"

von imonbln (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Unter Linux könntest du mit fcntl.lockf ein lock auf dein python script 
setzen und das dann Prüfen wenn es da ist läuft dein script gerade.

ungefähr so:
1
#! /usr/bin/env python
2
import os
3
import fcntl
4
5
def exclusive():
6
    # open own script to get a lock on it
7
    lfd = os.open(__file__, os.O_RDWR)
8
    try:
9
        # not blocking request for the lock
10
        fcntl.lockf(lfd, fcntl.LOCK_EX | fcntl.LOCK_NB)
11
    except IOError:
12
        print('other instance is running, DIE')
13
        return
14
    else:
15
        input('Here we are exclusive')
16
    # relase the lock
17
    fcntl.lockf(lfd, fcntl.LOCK_UN)
18
19
if __name__ == '__main__':
20
    exclusive()
21
    print('exit')

durch das fcntl.LOCK_NB geht der code in die exception und du weißt das 
auf dem system gerade eine andere instanze des script läuft. Das ganze 
sollte unter Linux und dem MAC gehen für Windows musst du mal googlen 
was es da für Funktionen gibt welche einen teil einer Datei exklusive 
locken.

von LOL (Gast)


Bewertung
0 lesenswert
nicht lesenswert
DPA schrieb:
> test schrieb:
>>> Lockfile ins /tmp und das /tmp auf die RAM-Disk ...
>>
>> Und wenn das Scipt abstürzt bootet man den Rechner neu, so fürs echte
>> Windows feeling ;-)
>
> Oder man löscht die Datei einfach. Gute bash Scripts setzen halt mit
> "trap" eine cleanup funktion. In C hat man signal handler. Bei python
> weiss ich jetzt nicht, da muss man halt schauen wie das Modul dafür,
> welches man nimmt, reagiert.

Das ist noch nicht mal notwendig, man kann es auch so machen wie Mozilla 
(Firefox, Thunderbird) mit seiner parent.lock Sperrdatei im Profil:
Die Datei bleibt während der Lebensdauer des Prozesses schreibend 
geöffnet (und dadurch gesperrt).

Das erneute Anlegen der Datei durch einen weitren Prozess schlägt so 
lange fehl, wie der ursprüngliche Prozess noch läuft -> neuer Prozess 
erkennt das und beendet sich weil er keine Sperre bekommt. Dadurch ist 
ein Aufräumen der Lockdatei nicht notwendig, wenn der Prozess abstürzt 
kann der nächste Prozess sie überschreiben, da das OS die Sperre dann 
aufhebt. Und aufräumen einer 0Byte Datei ist auch nicht zwingend 
notwendig.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.