Bash-Skript zum Starten und anschließenden Herunterfahren / Neustarten verschiedener Prozesse

7

Wenn ich meine Entwicklungsumgebung starte, gibt es eine Vielzahl von Prozessen, die ich im Hintergrund ausführen muss. Es ist mühsam, sie alle einzeln zu starten, deshalb möchte ich ein Skript schreiben, das jedes einzelne startet. Ich kann das ganz gut, aber das Problem tritt auf, wenn ich sie neu starten muss (etwas, das ich regelmäßig tun muss).

Was ist der einfachste Weg, um den Prozess beim Starten und Speichern dieser Informationen zu erfassen, sodass beim erneuten Ausführen des Skripts überprüft wird, ob diese Informationen gespeichert wurden, und diese Prozesse dann geschlossen werden, bevor sie neu gestartet werden.

Ich möchte auch, dass das Skript so flexibel ist, dass es beim manuellen Herunterfahren des Prozesses a) keinen Fehler auslöst, wenn es den Prozess nicht findet, und b) nicht versehentlich einen anderen Prozess herunterfährt, der seitdem irgendetwas gemeinsam genutzt hat Identifizierungsinformationen, die ich gespeichert habe.

Aktualisieren

Insbesondere möchte ich im Moment zumindest Folgendes tun:

1) Geben Sie einen kurzen Befehl wie "start-dev" ein

2) Führen Sie Folgendes aus (Beachten Sie, dass der zweite und der dritte Befehl im Hintergrund ausgeführt werden sollen und ich & verwende, jedoch nicht den letzten Befehl, da ich die Ausgabe des Passagiers während der Ausführung sehen möchte):

  1. Wechseln Sie in mein Arbeitsverzeichnis
  2. Starten Sie Faye als Hintergrundprozess
  3. Starten Sie watchr als Hintergrundprozess
  4. Passagier starten

Bisher habe ich das

#!/bin/bash
cd ~/path/to/my/working-directory
rackup faye.ru -s thin -E production &
watch refresh.watchr &
passenger start

Dies funktioniert gut, aber das Problem tritt auf, wenn ich alle diese Prozesse neu starten muss. Ich muss zuerst alle ihre Prozess-IDs aufspüren und sie dann töten, bevor ich start-dev erneut ausführen kann. Deshalb möchte ich:

4) Geben Sie einen kurzen Befehl wie "restart-dev" ein, der die zuvor im Hintergrund ausgeführten Prozesse aufspürt und sie dann beendet, bevor Sie "start-dev" erneut ausführen. Es muss in der Lage sein, keinen Fehler auszulösen, wenn ich einen dieser Fehler manuell heruntergefahren habe und nicht versehentlich einen falschen Prozess heruntergefahren habe.

Rupert Madden-Abbott
quelle
1
Nur ein kleiner Leckerbissen, den ich oft benutze. Stattdessen cd ~/path/to/my/working-directorybenutze ich normalerweise cd $(dirname $0). Es wird cdin das Arbeitsverzeichnis, in dem sich das Skript $0befindet.
Naisanza

Antworten:

9

Ich würde es so etwas angehen.

#!/bin/bash  

startme() {
    cd ~/path/to/my/working-directory
    rackup faye.ru -s thin -E production &
    watch refresh.watchr &
    passenger start
}

stopme() {
    pkill -f "rackup faye.ru" 
    pkill -f "watch refresh.watchr"
}

case "$1" in 
    start)   startme ;;
    stop)    stopme ;;
    restart) stopme; startme ;;
    *) echo "usage: $0 start|stop|restart" >&2
       exit 1
       ;;
esac
Glenn Jackman
quelle
1
Das hat super funktioniert, aber ich musste die letzte Zeile von "erledigt" in "esac" ändern. Ich habe ein paar Sekunden gebraucht, um herauszufinden, was zum Teufel ein Esac war :)
Rupert Madden-Abbott
@Rupert mich auch, lol. Und ich habe heute verwendet!
H_7
3

Ich würde sagen, Sie möchten wahrscheinlich ein Startskript schreiben, um diese Prozesse zu verwalten. Upstart ist ein Tool, das sich perfekt zum Verwalten von Systemdämonen eignet, sich aber auch für alle Arten von Prozessen eignet, bei denen Sie den Status steuern möchten.

Ein Upstart-Skript verfolgt einen Prozess, aber Sie können auch Skripts ausführen, bevor Sie ihn stoppen.

stop on runlevel [06]
expect fork
respawn

script
    # run your process here
    # you might want to su to change user from root
end script

pre-stop script
    # things in here will run before the command is halted
end script

Speichern Sie das unter /etc/init/devenvironment.confund dann sollten Sie es steuern können mit:

sudo start devenvironment
sudo stop devenvironment
sudo restart devenvironment
Oli
quelle
Danke Oli. Upstart sieht interessant aus, aber die Dokumentation schien sich nicht auf meinen Anwendungsfall zu konzentrieren, und ich konnte es nicht herausfinden. Am Ende habe ich mich für die schnelle und schmutzige Bash-Lösung entschieden, aber ich werde mich auf jeden Fall mit dem Erlernen des Emporkömmlings befassen, da es in der Tat sehr nützlich aussieht.
Rupert Madden-Abbott