Ausführungszeit des Hintergrundjobs protokollieren

Ausführungszeit des Hintergrundjobs protokollieren

Ich habe ein Skript, das ich im Hintergrund ausführe und die gesamte Ausgabe mit einem Befehl wie diesem erfasse:

nohup bash -x test.sh < /dev/null > log.txt 2>&1 &

Wie kann ich herausfinden, wie lange es gedauert hat? Wenn ich versuche, es zu verwenden, timeerhalte bash -xich eine Fehlermeldung:

/usr/bin/time: /usr/bin/time: cannot execute binary file

Wenn ich versuche, es zu verwenden, acctwird der Vorgang anscheinend nicht protokolliert oder ich kann ihn nicht finden.

Antwort1

[dabei wird davon ausgegangen, dass die Ausgabe von timeauch an gehen soll log.txt, was aus Ihrer Frage nicht klar hervorgeht]

Verwenden Sie es einfach nicht nohup.

nohuptut nichts besonderes, sondern ignoriert das SIGHUPSignal, leitet stdout und stderr in eine Datei um und --nur in einigen Varianten, wie den nohupvon GNU coreutils-- leitet den stdin von /dev/nullgeöffnet inNur SchreibenModus.

Dies alles können Sie ganz einfach über die Shell erledigen:

{ trap '' HUP; time bash -x your_script args ... ; } > log.txt 2>&1 0>/dev/null &

Oder sicherer, wenn es von einem Skript aus gestartet wird oder wenn Sie nicht vorhaben, den Befehl jemals wieder in den Vordergrund zu bringen, mit fg:

(trap '' HUP; time bash -x your_script args ... 0>/dev/null &) > log.txt 2>&1

(Sie können es weglassen, 0>/dev/nullwenn Sie diese Funktion von GNU nohup nicht emulieren möchten).


Natürlich kann man den Syntaxtrick aus dem ersten Beispiel auch bei nohup anwenden, wenn man aus unerfindlichen Gründen nohup magische Eigenschaften zuschreibt:

{ time nohup bash -x your_script args ... ; } > log.txt 2>&1 &

Antwort2

Nur timeder nohupAblauf:

$ time nohup bash -x ~/scripts/foo.sh 
nohup: ignoring input and appending output to 'nohup.out'

real    0m10.011s
user    0m0.005s
sys 0m0.006s

foo.shhat einfach sleep 10als Beispiel.

Antwort3

Sie können einfach Folgendes verwenden:

time yourscript.sh

Wenn das bei Ihnen jedoch nicht funktioniert, können Sie den Inhalt Ihres Skripts wie folgt umschließen:

STARTTIME=$(date +%s)
#command block that takes time to complete...
ENDTIME=$(date +%s)
echo "It takes $($ENDTIME - $STARTTIME) seconds to complete this task..."

verwandte Informationen