Prüfung ob Script bereits im Hintergrund läuft

FatManStanding

Lt. Junior Grade
Registriert
Aug. 2021
Beiträge
385
tach,

ich lasse manuell oder automatisch auf einem raspberry pi meine funksteckdosen schalten. dazu hab ich ein paar shellscripte mit einfachem inhalt im home-dir, z. b.

Code:
#!/bin/bash
/home/pi/bin/433Utils/RPi_utils/codesend 1049937


das sind inzwischen 20 scripte für 4 steckdosen. ich kann über alle anderen geräte (tablet, smartphone, kodi auf dem htpc, usw.) diese scripte ausführen. wie man sieht ist das eigentliche programm "433Utils", dass die funksignale senden. es kommt vor, dass ich in kurzen abständen mehrere scripte starte die dann versuchen ein signal zu senden, wenn ein anderes script das schon tut. eines geht verloren. ich wollte die scripte nun so abändern, dass man prüft ob 433utils gerade etwas tut und wartet bis es beendet ist. da ich aber 433utils in der liste der laufenden prozesse nicht finde, geht das nicht. die scripte haben keine eindeutig als "funk-prozess" erkennebare namen und umbenennen würde ich gern vermeiden, weil viele geräte (tablet, smartphone usw.) diese scripte starten und ich dort alles ändern müsste.

wieso taucht 433utils nicht als laufender prozess auf? gibt es eine möglichkeit den scripten einen "prozessnamen", unter dem sie in "ps" auftauchen, zuzuweisen?
 
Der Prozess müsste doch auch "codesend" heißen, oder nicht?
 
  • Gefällt mir
Reaktionen: guzzisti
Ich nutze das so (freebsd aber sind ja nur die Pfade anders) funktioniert unabhängig vom Namen des Skriptes, das wird immer automatisch in jedes Skript als "$0" übergeben

Code:
#!/usr/local/bin/bash

if ps ax | grep $0 | grep -v $$ | grep bash | grep -v grep
then
    echo "laeuft bereits..."
    exit 99
fi

Ahso lese gerade Du meinst nicht ob 1 Skript mehrfach läuft sondern ob 1 bestimmtes Programm läuft

Das wäre dann wohl

Code:
if ps ax | grep "codesend" | grep -v $$ | grep -v "grep"
then
    echo "codesend laeuft..."
    exit 99
fi

Evtl hilft Dir aber auch der erste Teil, drum lass ich den mal stehen :D
 
Zuletzt bearbeitet von einem Moderator:
Jap der Prozess heißt codesend und wenn das nicht will, ruf ein Shell Script als Wrapper auf, das ein Lock File erstellt und mit diesem arbeitet.
 
  • Gefällt mir
Reaktionen: andy_m4 und guzzisti
Entweder die PID des richtigen Programms (evtl. codesend) überprüfen,

oder bei Scripten einfach eine globale Variable einfügen:
"xxxirgendwas:_running" = 0/1,
beim scripstart auf 1 setzen, am scriptende wieder auf 0 und dann am anfang abfragen...,

oder Lock-File,

oder... so viele Möglichkeiten.
 
ja, hast recht. und ich hab grad gesehen, dass der doch auftauscht ich nur falsch gesucht hab. ich hab einfach

Code:
ps aux | grep *codesend*

in einer endlosschleife laufen lassen und dann in einem anderen terminalfenster das script ausgeführt. mit den * taucht der prozess nicht auf, aber mit

Code:
ps aux | grep codesend

schon. dachte * ersetzt "jedes" zeichen? der prozess taucht als

Code:
/home/pi/bin/433Utils/RPi_utils/codesend 1397841

auf, wobei die zahl der funkcode ist. vllt. ersetzt * kein leerzeichen wie zwischen codesend und der zahl und kein / wie im pfad?
 
Regular Expressions für die Nutzung als Parameter von grep sind so definiert
https://www.cyberciti.biz/faq/grep-regular-expressions/

Ohne RegEx sucht grep halt den Teilstring

Nicht vergessen mit | grep -v "grep" den grep prozess selbst auszuklammern! sonst bekommste mit "ps aux | grep codesend" IMMER true zurück weil "grep codesend" halt läuft und damit "codesend" gefunden wird xD

also
Code:
ps aux | grep "codesend" | grep -v "grep"

oder wenn du das mit regulären Ausdrücken willst z.B.
Code:
ps aux | grep "codesend [[:digit:]]*" | grep -v "grep"
 
Zuletzt bearbeitet von einem Moderator:
Wishbringer schrieb:

Mag ich sehr. In /dev/shm stört das nicht und bei jedem Neustart ist alles sauber.
 
Bei Lockfiles kann es nicht schaden Exceptions, bzw. Ausnahmefehler abzufangen, insbesondere wenn man mit 'set -e' arbeitet (exit on error). Sonst kann es passieren, dass das Lockfile verwaist und kein Script mehr startet.

Code:
#!/bin/bash

err_report() {
    echo "Error on line $1"
    rm /tmp/mylockfile.lck
}

trap 'err_report $LINENO' ERR

# Start
[[ -e /tmp/mylockfile.lck ]] && (echo "Error: script already in use (/tmp/mylockfile.lck)"; exit 2)
set -e
touch /tmp/mylockfile.lck
echo "Hello World!"
blahblah <-- error (jump to trap)
rm /tmp/mylockfile.lck

# End
 
Zuletzt bearbeitet:
Zurück
Oben