Ich habe ein Skript, das alle 15 Minuten läuft, aber manchmal, wenn die Box beschäftigt ist, hängt es und der nächste Prozess wird gestartet, bevor der erste fertig ist zu erstellen ein Schneeballeffekt. Wie kann ich dem Bash-Skript ein paar Zeilen hinzufügen, um vor dem Start zu prüfen, ob etwas ausgeführt wird?Wie ein Bash-Skript einchecken, wenn etwas läuft und beenden, wenn es
Antwort
Anstelle von Pidfile, solange Ihr Skript einen eindeutig identifizierbaren Namen hat man so etwas tun kann:
#!/bin/bash
COMMAND=$0
# exit if I am already running
RUNNING=`ps --no-headers -C${COMMAND} | wc -l`
if [ ${RUNNING} -gt 1 ]; then
echo "Previous ${COMMAND} is still running."
exit 1
fi
... rest of script ...
Ich tat dies und Ich musste es ein wenig zwicken. Zunächst enthält COMMAND den vollständigen Pfad, so dass es nicht funktioniert, wenn Sie es nicht aus demselben Verzeichnis ausführen. Ich habe den Namen trotzdem fest codiert. Zweitens, aus irgendeinem Grund ps --no-header -C $ {COMMAND} | wc -l gab immer 1 zurück, ohne dass etwas lief, und da dieses Skript läuft, während es überprüft, ist das eine andere 1, also gab es immer 2 zurück. Ich musste das -gt 1 zu -gt 2 ändern und es funktionierte. Vielen Dank. –
Warum eine Sperrdatei nicht einrichten?
So etwas wie
yourapp.lock
Sie es einfach entfernen, wenn Sie beendet verarbeiten, und es überprüfen, bevor es zu starten.
Es könnte
if [ -f yourapp.lock ]; then
echo "The process is already launched, please wait..."
fi
Da die korrekte Verwaltung einer Sperrdatei, insbesondere die Behandlung von Fällen, in denen ein Prozess nicht ordnungsgemäß beendet wurde und dessen Sperrdatei nicht gelöscht werden konnte, dauert es mehr als ein paar Zeilen in bash. – chaos
Wenn Sie 'flock' verwenden, sind Lock-Dateien einfach zu verwalten - aber ja,' -f' zu verwenden, um ihre Existenz zu testen, ist Evil And Wrong. –
Sie können pidof -x
verwenden getan werden, wenn Sie die Prozessnamen kennen, oder kill -0
, wenn Sie die PID kennen.
Beispiel:
if pidof -x vim > /dev/null
then
echo "Vim already running"
exit 1
fi
zu erweitern, was @bgy sagt, die sichere Atom Weise eine Sperrdatei zu erstellen, wenn es noch nicht vorhanden ist, und nicht, wenn es nicht der Fall ist, ist zu Erstellen Sie eine temporäre Datei und verbinden Sie sie dann mit der Standardsperrdatei. Dies schützt vor einem anderen Prozess, der die Datei zwischendurch erstellt, während Sie sie testen und Sie erstellen. Hier
ist die Lock-Datei Code aus meinem Stunden Backup-Skript:
echo $$ > /tmp/lock.$$
if ! ln /tmp/lock.$$ /tmp/lock ; then
echo "previous backup in process"
rm /tmp/lock.$$
exit
fi
Vergessen Sie nicht, sowohl die Sperrdatei und die temporäre Datei zu löschen, wenn Sie fertig sind, auch wenn Sie früh durch einen Ausgang Error.
Verwenden Sie dieses Skript:
FILE="/tmp/my_file"
if [ -f "$FILE" ]; then
echo "Still running"
exit
fi
trap EXIT "rm -f $FILE"
touch $FILE
...script here...
Dieses Skript wird eine Datei erstellen und diese an der Ausfahrt entfernen.
Für ein Verfahren, das nicht von Parsen Bugs und Rennbedingungen nicht leiden, finden Sie unter:
hatte ich vor kurzem die gleiche Frage und fand von oben, dass töten -0 am besten für meine Fall:
echo "Starting process..."
run-process > $OUTPUT &
pid=$!
echo "Process started pid=$pid"
while true; do
kill -0 $pid 2> /dev/null || { echo "Process exit detected"; break; }
sleep 1
done
echo "Done."
Dies ist, wie ich es tun in einer meiner Cronjobs
lockfile=~/myproc.lock
minutes=60
if [ -f "$lockfile" ]
then
filestr=`find $lockfile -mmin +$minutes -print`
if [ "$filestr" = "" ]; then
echo "Lockfile is not older than $minutes minutes! Another $0 running. Exiting ..."
exit 1
else
echo "Lockfile is older than $minutes minutes, ignoring it!"
rm $lockfile
fi
fi
echo "Creating lockfile $lockfile"
touch $lockfile
und die Lock-Datei am Ende des Skripts löschen
echo "Removing lock $lockfile ..."
rm $lockfile
- 1. prüfen, ob ein Prozess läuft, und Ausgang, wenn es bereits
- 2. Wie überprüft man, ob ein Service über Batch-Datei läuft und startet es, wenn es nicht läuft?
- 3. Wie ein Programm zu töten, wenn es zu lange läuft
- 4. javascript indexOf Einchecken wenn Anweisung
- 5. Wie logge ich etwas in Controller, wenn Phoenix Server läuft?
- 6. NSThread beenden, wenn app beenden
- 7. Beenden Python-Programm, wenn es Speicherlimit erreicht
- 8. Python beenden einen Thread, wenn es schläft
- 9. Etwas vor dem Programm beenden
- 10. Ich möchte etwas machen, wenn ich es bearbeite EditText
- 11. Catch, wenn ein Gitterraum etwas enthält
- 12. Wenn ich ein Makefile schreibe, wie kann ich einen Subprozess beim Beenden beenden?
- 13. Wie fügt man "Loading icon" hinzu und dimmt den Hintergrund, wenn etwas im Backend läuft?
- 14. Einchecken von Javascript, wenn ein SSL-Zertifikat gültig ist
- 15. Beenden ein Bash-Skript, wenn ein Fehler auftritt, darin oder einer des Hintergrundjobs schafft es
- 16. Keine Exit-Option, wenn etwas ausgeführt wird
- 17. django Entwicklungsserver, wie man es stoppt, wenn es im Hintergrund läuft
- 18. Wie JPA einchecken, wenn verbundene Spalte Daten mit Bedingung
- 19. Wie kann ich Powershell einchecken, wenn Get-ChildItem fehlgeschlagen ist?
- 20. Wenn #if DEBUG läuft
- 21. Wie einchecken NodeJS, wenn JSON-Datei bereits bestimmte Daten
- 22. Problem, wenn mysqld läuft
- 23. So stellen Sie sicher, dass ein bestimmter Prozess nicht ausgeführt wird, und Skript beenden, wenn es
- 24. Wie alle Sitzung beenden, wenn Abmeldung
- 25. Wie man etwas macht, während ein Prozess läuft Unity3d
- 26. Wenn Array isset, etwas tun?
- 27. wie etwas zu tun, wenn ein Element Geschwister hat
- 28. Festlegen der Objekteigenschaft und Einchecken von Start(), wenn es null funktioniert
- 29. Wie Sie ASP.NET einchecken, wenn der Benutzer online ist?
- 30. Erhalten scanf, um zu beenden, wenn es einen Zeilenumbruch liest?
Dupe von 185451. – Rob
Siehe [http://stackoverflow.com/questions/185451/quick-and-dirtyway-to-ensure-only-one-instance-of-a-shell-script-is-running-at-a](http : //stackoverflow.com/questions/185451/quick-and-dirty-way-to-ensure-only-one-instance-of-a-shell-script-is-runnin g-at-a). – Rob
mögliches Duplikat der [Shell-Skript-Ausführungsüberprüfung, ob es bereits läuft oder nicht] (http://stackoverflow.com/questions/16807876/shell-script-execution-check-if-it-is-ready-running-oder- nicht) – Pureferret