exit 1 wenn Zeit abgelaufen ist

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
minimike
Beiträge: 5594
Registriert: 26.03.2003 02:21:19
Lizenz eigener Beiträge: neue BSD Lizenz
Wohnort: Köln
Kontaktdaten:

exit 1 wenn Zeit abgelaufen ist

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

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: exit 1 wenn Zeit abgelaufen ist

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!

Benutzeravatar
Meillo
Moderator
Beiträge: 8818
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: exit 1 wenn Zeit abgelaufen ist

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: 1997
Registriert: 10.12.2008 10:51:41

Re: exit 1 wenn Zeit abgelaufen ist

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

Benutzeravatar
minimike
Beiträge: 5594
Registriert: 26.03.2003 02:21:19
Lizenz eigener Beiträge: neue BSD Lizenz
Wohnort: Köln
Kontaktdaten:

Re: exit 1 wenn Zeit abgelaufen ist

Beitrag von minimike » 12.10.2023 18:48:01

tobo hat geschrieben: ↑ zum Beitrag ↑
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: 1997
Registriert: 10.12.2008 10:51:41

Re: exit 1 wenn Zeit abgelaufen ist

Beitrag von tobo » 12.10.2023 19:10:43

minimike hat geschrieben: ↑ zum Beitrag ↑
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.

Benutzeravatar
minimike
Beiträge: 5594
Registriert: 26.03.2003 02:21:19
Lizenz eigener Beiträge: neue BSD Lizenz
Wohnort: Köln
Kontaktdaten:

Re: exit 1 wenn Zeit abgelaufen ist

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

Antworten