staging.inyokaproject.org

Per script abfragen, ob ein anderes bereits läuft

Status: Gelöst | Ubuntu-Version: Xubuntu 18.04 (Bionic Beaver)
Antworten |

matze31

Anmeldungsdatum:
25. Oktober 2015

Beiträge: 795

Ich mache nochmal einen neuen Thread auf.

Kann man in einen Script (vorzugsweise Python) eine Abfrage machen, ob ein Script bereits läuft?

In Python gibt es zwar psutil, aber so richtig bringt mir das nicht weiter, weil es nach meiner Meinung nur das Programm an sich (also Python) anzeigt.

Könnte man das ändern, indem ich das Script mit einen Dienst starte und angezeigt bekomme?

Gibt es noch andere Alternativen wie man das sauber lösen kann?

Unsauber habe ich bereits schon, da schreibe ich mir beim start eine leere Datei in /tmp und beim beenden lösche ich es wieder.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13242

matze31 schrieb:

Kann man in einen Script (vorzugsweise Python) eine Abfrage machen, ob ein Script bereits läuft?

Mindestens kannst Du pgrep aufrufen.

In Python gibt es zwar psutil, aber so richtig bringt mir das nicht weiter, weil es nach meiner Meinung nur das Programm an sich (also Python) anzeigt.

Ich sehe den Namen des Skriptes ohne Pfad.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
#!/usr/bin/python3

import psutil
import getpass
import re

pids = psutil.pids()
rx = re.compile("\\.py\\Z")

print(len(pids))

for process in map(psutil.Process, pids):
    try:
        if process.username() == getpass.getuser() and rx.search(process.name()):
            print("%s : %s %s" % (process.name(), process.exe(), process.cmdline()))
    except:
        True

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Ich bin kein Schlangenbeschwörer - hast Du mal geschaut, ob es einen Unterschied macht, ob Du

1
python7 my123.py 

oder mit Shebang als

1
my123.py

startest? Letzteres ist doch möglich, wenn man das Skript ausführbar macht und irgendwo im Pfad exponiert.

Beispiel mit einem Shellscript namens warte.sh:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#!/bin/bash
#
#

warte () {

	dauer=$1
	anzahl=$2

	for a in $(seq 1 $anzahl)
	do
		sleep $dauer
		echo -n "."
	done
	echo
}

warte $1 $2

Das Skript soll nur solange laufen, dass man mit ps währenddessen in einer anderen Shell schauen kann, ob es läuft. Auf jeden guten Programmierstil wurde verzichtet (prüfen ob überhaupt Parameter übergeben wurden, Hilfetext).

Start mit executable + Shebang:

1
2
3

./warte.sh .300 100 
....................................................................................................

Kontrolle:

1
2
3
 ps -C warte.sh 
  PID TTY          TIME CMD
 5271 pts/1    00:00:00 warte.sh

Start über bash:

1
2
bash warte.sh .300 100 
.............................................................................

Kontrolle:

1
2
t201:~/proj/mini/forum/markdown > ps -C warte.sh 
  PID TTY          TIME CMD

Ob es die Sache vereinfachst, wenn Du das Skript mit systemd startest, weiß ich nicht. Das ist auch kein Hexenwerk - ich habe es auch hier aus dem Wiki gelernt.

Ah - jetzt war Kollege rklm schneller - bei mir war die Gasleitungskontrolle, so dass es länger gedauert hat; mein Beitrag entstand nicht als Reaktion auf seinen. Seiner trieft wahrscheinlich stärker von Pythonwissen. ☺

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11278

matze31 schrieb:

In Python gibt es zwar psutil, aber so richtig bringt mir das nicht weiter, weil es nach meiner Meinung nur das Programm an sich (also Python) anzeigt.

Du bekommst auch die Argumente, mit denen der Prozess gestartet wurde (oder mal mit p.as_dict() das Prozess-Objekt in ein Dictionary umwandeln, um alle möglichen Daten sehen zu können):

1
2
3
4
5
import psutil

for p in psutil.process_iter():
  if "python" ==  p.name():
      print(p.cmdline())

Könnte man das ändern, indem ich das Script mit einen Dienst starte und angezeigt bekomme?

Ja, man könnte Systemd die Prozesskontrolle überlassen. Da muss man sich halt etwas in das DBus-Interface einfuchsen, wenn man nicht die Ausgabe von systemctl parsen will.

Gibt es noch andere Alternativen wie man das sauber lösen kann?

Was genau machen denn die beiden Skripte? Je nachdem was das Skript macht, dessen Status bestimmt werden soll, könnte sich ggf. sowas wie eine Warteschlange oder das dynamische Hinzufügen von Aufgaben über DBus, einen Unix-Sockel usw. lohnen.

Unsauber habe ich bereits schon, da schreibe ich mir beim start eine leere Datei in /tmp und beim beenden lösche ich es wieder.

Der Ansatz mit den .pid-Dateien ist alt bewährt und funktioniert unabhängig vom Init-System.

matze31

(Themenstarter)

Anmeldungsdatum:
25. Oktober 2015

Beiträge: 795

Dank eurer Hilfe bin ich jetzt zu diesen Ergebnis gekommen.

#!/usr/bin/python3
import psutil
import re

for p in psutil.process_iter():
    if re.search("mein.py", str(p.cmdline())):
        print(p.cmdline(),)
        print("script läuft")

Steht alles in der psutil doku, aber ich versteh leider nicht immer was die ganzen Funktionen machen, trotz Beschreibung.

Vielen dank.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17630

Und wenn der Prozess

1
gedit mein.py

lautet? ☺

matze31

(Themenstarter)

Anmeldungsdatum:
25. Oktober 2015

Beiträge: 795

user_unknown schrieb:

Und wenn der Prozess

1
gedit mein.py

lautet? ☺

Ich schaue mal ob es da Schwierigkeiten gibt, mit dem was ich mache.

Antworten |