yeniceri
Anmeldungsdatum: 31. Juli 2015
Beiträge: Zähle...
|
Hallo zusammen, Ich bräuchte ein script was ich überwachen möchte aber auch neustarten wenn es beendet ist. Da ich gleichen bin datei mehrmals gestartet habe sollte es über PIDfiles kontrolliert werden. Pidfiles werden erstellt. Es wäre klasse wenn mir einer helfen könnte. Danke nochmals.
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17552
Wohnort: Berlin
|
yeniceri schrieb: Hallo zusammen, Ich bräuchte ein script was ich überwachen möchte aber auch neustarten wenn es beendet ist.
Das klingt, als hättest Du noch kein Script.
Da ich gleichen bin datei mehrmals gestartet habe sollte es über PIDfiles kontrolliert werden.
Das klingt, als ginge es um eine Binärdatei - oder was heißt "bin datei"? - und, wegen der Vergangenheitsform "habe", als gäbe es diese Datei/dieses Programm schon und sei von Dir auch schon gestartet worden.
Pidfiles werden erstellt.
Auch das klingt, als hättest Du jenes Programm schon. Soll das Script die Binärdatei starten und neu starten, wenn es beendet wird? Und soll das Programm mehrfach parallel laufen? Und was hat es mit der PID-Datei auf sich?
Es wäre klasse wenn mir einer helfen könnte.
Wenn die Frage klarer wäre, wahrscheinlich.
|
yeniceri
(Themenstarter)
Anmeldungsdatum: 31. Juli 2015
Beiträge: 7
|
Wenn ich ein script hätte wieso sollte ich den hier schreiben. Ja es ist eine Binäredatei. Ja ich starte die Binäredatei mehrmals Was mit dem pidfile auf sich hat wie soll man den gleichnamige Dateien unterscheiden.
Welches noch läuft und welche nicht. Und was soll den noch klarer sein Ich starte eine Binäredatei mehrmals und die sollen überwacht werden wenn es beendet ist soll es dann gestartet werden. bsp. /etc/init.d/1 start So starte ich es zur zeit. Ich hoffe hast jetzt verstanden.
|
lubux
Anmeldungsdatum: 21. November 2012
Beiträge: 13933
|
yeniceri schrieb: Ich starte eine Binäredatei mehrmals und die sollen überwacht werden wenn es beendet ist ...
Du könntest deine Prozesse, z. B. über den Rückgabewert von pidof oder über den Rückgabewert von ps überwachen. Z. B.:
:~$ pidof leafpad; echo $?
7301 7268 7250 4679
0
:~$ pidof leafpadxy; echo $?
1
oder:
:~$ ps -fC leafpad > /dev/null 2>&1; echo $?
0
:~$ ps -fC leafpadxy > /dev/null 2>&1; echo $?
1
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
Erst mal herzlich willkommen hier im Forum, yeniceri! lubux schrieb:
Du könntest deine Prozesse, z. B. über den Rückgabewert von pidof oder über den Rückgabewert von ps überwachen. Z. B.:
Robuster ist m.E., wenn man sich die Child PID nach dem Starten im Skript merkt und dann genau den einen Prozess neu startet, wenn er beendet ist. Das ist insbesondere wichtig, wenn die Binaries mit unterschiedlichen Kommandozeilenoptionen gestartet werden. Ansonsten weiß man ja nicht, welches pidof oder pgrep erwischt hat bzw. nicht erwischt hat, falls es beendet worden ist. Ich hatte hier im Forum vor längerer Zeit schon mal so etwas gepostet. Du findest es über meine Benutzerseite.
|
yeniceri
(Themenstarter)
Anmeldungsdatum: 31. Juli 2015
Beiträge: 7
|
danke dir @lubux aber der @rklm hats auf den Punkt gebracht danke. Nur ich hab alles abgesucht finde leider nichts kannst du mir weiter helfen.
|
Mooi
Anmeldungsdatum: 15. August 2014
Beiträge: 187
|
Mit sehr viel Pech könnte die PID mehrfach benutzt werden, deshalb greppe ich in solchen Fällen /proc/PID/cmdline nach dem Programmnamen. Ein kleines Beispiel:
1
2
3
4
5
6
7
8
9
10
11
12 | # Programm (zum testen: sleep) starten und PID merken:
sleep 10s & pid=$!
# Schleife zum Überwachen
while sleep 3s; do
if grep "^sleep" /proc/$pid/cmdline &>/dev/null; then
echo "Programm läuft noch"
else
echo "Programm läuft nicht mehr"
break
fi
done
|
Das Skript kann sich am Ende einfach selbst neu starten ($0), um endlos zu laufen. Das sleep in der while-Zeile hat nichts mit dem gesuchten "Test-sleep" zu tun.
|
yeniceri
(Themenstarter)
Anmeldungsdatum: 31. Juli 2015
Beiträge: 7
|
Wenn ich es nur einmal nutzen würde hast du recht würde auch klappen. Nur ich möchte die Binäredateien nicht mehrmals anlegen und umbenennen. Ich Starte ein script schon /etc/init.d/1 start
und zweiten mit /etc/init.d/2 start halt manuell alles Lasse auch pid auslesen und es kann nicht doppelten pid nutzen beim starten.
Log und pid beide werden abgelegt in Dateien. Wie kann ich so meine Prozesse überwachen.
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 12822
|
Mooi schrieb: Mit sehr viel Pech könnte die PID mehrfach benutzt werden,
??? Es gibt zu jeder Zeit immer nur einen Prozess mit einer bestimmten PID.
deshalb greppe ich in solchen Fällen /proc/PID/cmdline nach dem Programmnamen. Ein kleines Beispiel:
1
2
3
4
5
6
7
8
9
10
11
12 | # Programm (zum testen: sleep) starten und PID merken:
sleep 10s & pid=$!
# Schleife zum Überwachen
while sleep 3s; do
if grep "^sleep" /proc/$pid/cmdline &>/dev/null; then
echo "Programm läuft noch"
else
echo "Programm läuft nicht mehr"
break
fi
done
|
Das finde ich viel zu umständlich und wenig robust: wenn Du die PID schon hast, dann nimm einfach kill -0 $pid 2>/dev/null . Außerdem musst Du die Kommandozeile an zwei Stellen kennen (Zeilen 2 und 6). Und schließlich ist es viel effizienter mit wait auf das Beenden des Kindes zu warten als in einer Schleife mit sleep . Schau Dir mal mein Skript an. Zusätzlich verhindert man dadurch Zombies. Deine Lösung liest nämlich nie den Exit-Status aus. Wenn das Skript sich am Ende selbst startet, wird das Kind an init weitergereicht und ordentlich abgeräumt. Wenn Du eine Schleife außen herum baust, dann brauchst Du wait um den Zombie zu verhindern.
Das Skript kann sich am Ende einfach selbst neu starten ($0), um endlos zu laufen.
Dann aber nicht vergessen, es über exec zu überlagern. Sonst bekommst Du mehr Prozesse als Dir lieb ist. Ich halte eine Schleife innerhalb des Prozesses allerdings für effizienter - und auch leichter zu verstehen. yeniceri schrieb:
Nur ich hab alles abgesucht finde leider nichts kannst du mir weiter helfen.
Schau noch mal, Du findest das schon. ☺
|
yeniceri
(Themenstarter)
Anmeldungsdatum: 31. Juli 2015
Beiträge: 7
|
Gib mir mal link pls ich suche schon seit heute morgen ☺
|
Mooi
Anmeldungsdatum: 15. August 2014
Beiträge: 187
|
rklm schrieb: ??? Es gibt zu jeder Zeit immer nur einen Prozess mit einer bestimmten PID.
So meinte ich das nicht. Nachdem sich das Programm beendet hat, könnte ein ganz anderer Prozess die PID bekommen, die das Programm hatte. Das ist sehr unwahrscheinlich, aber nicht unmöglich. Deshalb das grep auf PID und Name.
|
noisefloor
Ehemaliger
Anmeldungsdatum: 6. Juni 2006
Beiträge: 29048
Wohnort: WW
|
Hallo, wie wäre es denn mit supervisord? Gruß, noisefloor
|
yeniceri
(Themenstarter)
Anmeldungsdatum: 31. Juli 2015
Beiträge: 7
|
Das starte ich nur ich möchte es halt am laufen haben wenn es auch stoppt. Am besten wäre natürlich wenn url nicht vorhanden ist das script auch nicht startet erst dann wenn url wieder da ist soll es laufen
nur bekomme ich das irgend wie nicht hin muss immer stoppen das ganze und neu starten. #!/bin/sh
url=""
SCRIPT="/home/ds3532/bin/ffmpeg -i "$url" -acodec mp3 -b:a 128 -vcodec libx264 -b:v 2000 -bufsize 1000-threads 2 "rtmp://""
RUNAS=root
PIDFILE=/home/ds3532/run/1.pid
LOGFILE=/home/ds3532/log/1.log
start() {
if [ -f /home/ds3532/run/$PIDNAME ] && kill -0 $(cat /home/ds3532/run/$PIDNAME); then
echo 'Stream 1 läuft' >&2
return 1
fi
echo 'Stream 1 startet' >&2
local CMD="$SCRIPT &> \"$LOGFILE\" & echo \$!"
su -c "$CMD" $RUNAS > "$PIDFILE"
echo 'Stream 1 OK' >&2
}
stop() {
if [ ! -f "$PIDFILE" ] || ! kill -0 $(cat "$PIDFILE"); then
echo 'Stream 1 stopt' >&2
return 1
fi
echo 'Stream 1 stopt' >&2
kill -15 $(cat "$PIDFILE") && rm -f "$PIDFILE"
echo 'Stream 1 gestopt' >&2
}
case "$1" in
start)
start
;;
stop)
stop
;;
retart)
stop
start
;;
*)
echo "Usage: $0 {start|stop|restart}"
esac
|
yeniceri
(Themenstarter)
Anmeldungsdatum: 31. Juli 2015
Beiträge: 7
|
keiner eine Idee und @rklm bitte ich hab immer noch nicht gefunden schick mir mal pls link.
|