Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
-
minimike
- Beiträge: 5616
- Registriert: 26.03.2003 02:21:19
- Lizenz eigener Beiträge: neue BSD Lizenz
- Wohnort: Köln
-
Kontaktdaten:
Beitrag
von minimike » 12.10.2023 01:03:01
Hi
Das Script unten anstehend funktioniert. Aber da fehlt noch was und ich bekomme es nicht hin
Wenn die erste condition erfüllt ist, dann ist Schluss mit "exit 0" Wenn nicht dann läuft jede Sekunde ein Befehl. Und das so lange bis es erfolgreich ist. Wenn Erfolgreich dann Schluss. Final ist aber nach 900 Sekunden (15 min) Schluss.
Wenn die 15 Minuten rum sind und es immer noch nicht Erfolgreich beendet wurde, möchte ich das bei Beendigung Das Script sich mit "exit 1" Beendet. Und als Sahnehäubchen kann ich den exit code mit "echo $?" noch stdout Ausgeben
Ich habe Gründe es diemal nicht mit Ansible zu Machen. Für einen Tip wäre ich Dankbar
Code: Alles auswählen
#!/usr/bin/env bash
SERVER="puppekopp"
TLD="webterrorist.local"
ADDRESS=${SERVER}.${TLD}
declare -ir MAX_SECONDS=900
declare -ir TIMEOUT=$SECONDS+$MAX_SECONDS
nc -z -w 3 $ADDRESS 9090 > /dev/null
state=$?
if [ $state -ne 0 ]; then
ipmitool -I lanplus -U der_weise_greise -P linuxhuakbar -H ip-address power on > /dev/null
while (( $SECONDS < $TIMEOUT )); do
nc -z -w 3 $ADDRESS 9090 > /dev/null
if [ $? -eq 0 ]; then
break
else [ $? -ne 0 ];
sleep 1 &> /dev/null
# exit 1
fi
done
fi
"Lennart Poettering is one of those typical IT leaders..." "like Linus Torvalds and Theo de Raadt?" "more like Bozo the Clown" After all, now a good employee of Microsoft
-
Meillo
- Moderator
- Beiträge: 9241
- Registriert: 21.06.2005 14:55:06
- Wohnort: Balmora
-
Kontaktdaten:
Beitrag
von Meillo » 12.10.2023 06:49:44
Das ist zwar nicht ganz das, was du suchst, aber vielleicht hilft's weiter:
Code: Alles auswählen
#!/bin/sh
sleep 5 && kill $$ &
echo start
while sleep 1; do
echo tick
done
echo stop
Sieht dann so aus:
Code: Alles auswählen
:-/ ./sleep-exit.sh
start
tick
tick
tick
tick
Terminated
:-/ echo $?
143
(Der Exit-Code ist 128 + die Signalnummer, hier 15 fuer SIGTERM.)
Use ed once in a while!
-
Meillo
- Moderator
- Beiträge: 9241
- Registriert: 21.06.2005 14:55:06
- Wohnort: Balmora
-
Kontaktdaten:
Beitrag
von Meillo » 12.10.2023 09:35:02
Das hier koennte sein, was du suchst:
https://stackoverflow.com/a/1570356
Code: Alles auswählen
# simulate a long process that will have an identifiable exit code
(sleep 15 ; /bin/false) &
my_pid=$!
while ps | grep " $my_pid " # might also need | grep -v grep here
do
echo $my_pid is still in the ps output. Must still be running.
sleep 3
done
echo Oh, it looks like the process is done.
wait $my_pid
# The variable $? always holds the exit code of the last command to finish.
# Here it holds the exit code of $my_pid, since wait exits with that code.
my_status=$?
echo The exit status of the process was $my_status
D.h. in deiner Schleife kannst du schauen, ob der Timeout-Sleep-Prozess im Hintergrund noch laeuft und wenn nicht, dann exit aufrufen.
Use ed once in a while!
-
tobo
- Beiträge: 2362
- Registriert: 10.12.2008 10:51:41
Beitrag
von tobo » 12.10.2023 10:04:49
Auf die 15 Minuten (auch unter Last) bezogen vielleicht sowas:
Code: Alles auswählen
TIME=`date -d "+15 min" "+%s"`
until nc -z -w 3 "$ADDRESS" 9090 >/dev/null; do
sleep 1s
[ "$TIME" -le `date "+%s"` ] && exit 1
done
-
minimike
- Beiträge: 5616
- Registriert: 26.03.2003 02:21:19
- Lizenz eigener Beiträge: neue BSD Lizenz
- Wohnort: Köln
-
Kontaktdaten:
Beitrag
von minimike » 12.10.2023 18:48:01
tobo hat geschrieben: 12.10.2023 10:04:49
Auf die 15 Minuten (auch unter Last) bezogen vielleicht sowas:
Code: Alles auswählen
TIME=`date -d "+15 min" "+%s"`
until nc -z -w 3 "$ADDRESS" 9090 >/dev/null; do
sleep 1s
[ "$TIME" -le `date "+%s"` ] && exit 1
done
Danke dir, dass brachte mir die richtige Idee
Code: Alles auswählen
#!/usr/bin/env bash
SERVER="foreman"
TLD="webterrorist.local"
ADDRESS=${SERVER}.${TLD}
TIME=`date -d "+20 sec" "+%s"`
nc -z -w 3 $ADDRESS 9090 > /dev/null
if [ $? -ne 0 ]; then
echo "triggering ipmitool"
ipmitool -I lanplus -U der_weise_greise -P linuxhuakbar -H ip-address power on > /dev/null
until nc -z -w 3 $ADDRESS 9090 > /dev/null 2>/dev/null
do
if [ $? -eq 0 ]; then
break
else [ $? -ne 0 ];
echo "wait for power up"
sleep 2 &> /dev/null
fi
if [ "$TIME" -le `date "+%s"` ]; then
echo "seems we have an issue"
exit 1
fi
done
fi
"Lennart Poettering is one of those typical IT leaders..." "like Linus Torvalds and Theo de Raadt?" "more like Bozo the Clown" After all, now a good employee of Microsoft
-
tobo
- Beiträge: 2362
- Registriert: 10.12.2008 10:51:41
Beitrag
von tobo » 12.10.2023 19:10:43
minimike hat geschrieben: 12.10.2023 18:48:01
Danke dir, dass brachte mir die richtige Idee
Code: Alles auswählen
#!/usr/bin/env bash
SERVER="foreman"
TLD="webterrorist.local"
ADDRESS=${SERVER}.${TLD}
TIME=`date -d "+20 sec" "+%s"`
nc -z -w 3 $ADDRESS 9090 > /dev/null
if [ $? -ne 0 ]; then
echo "triggering ipmitool"
ipmitool -I lanplus -U der_weise_greise -P linuxhuakbar -H ip-address power on > /dev/null
until nc -z -w 3 $ADDRESS 9090 > /dev/null 2>/dev/null
do
if [ $? -eq 0 ]; then
break
else [ $? -ne 0 ];
echo "wait for power up"
sleep 2 &> /dev/null
fi
if [ "$TIME" -le `date "+%s"` ]; then
echo "seems we have an issue"
exit 1
fi
done
fi
Die until-Schleife wird solange ausgeführt, wie die Bedingung (nc -z -w 3...) false ergibt. Du kannst dir also die Fallunterscheidung danach sparen:
Code: Alles auswählen
until nc -z -w 3 "$ADDRESS" 9090 > /dev/null 2>/dev/null; do
echo "wait for power up"
sleep 2 &> /dev/null
if [ "$TIME" -le "`date "+%s"`" ]; then
echo "seems we have an issue"
exit 1
fi
done
fi
Zudem solltest du Werte, die du ausliest, standardmäßig quoten, sofern nichts dagegenspricht.
-
minimike
- Beiträge: 5616
- Registriert: 26.03.2003 02:21:19
- Lizenz eigener Beiträge: neue BSD Lizenz
- Wohnort: Köln
-
Kontaktdaten:
Beitrag
von minimike » 12.10.2023 20:26:54
Danke @tobo
"Lennart Poettering is one of those typical IT leaders..." "like Linus Torvalds and Theo de Raadt?" "more like Bozo the Clown" After all, now a good employee of Microsoft