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, time
erhalte bash -x
ich eine Fehlermeldung:
/usr/bin/time: /usr/bin/time: cannot execute binary file
Wenn ich versuche, es zu verwenden, acct
wird der Vorgang anscheinend nicht protokolliert oder ich kann ihn nicht finden.
Antwort1
[dabei wird davon ausgegangen, dass die Ausgabe von time
auch an gehen soll log.txt
, was aus Ihrer Frage nicht klar hervorgeht]
Verwenden Sie es einfach nicht nohup
.
nohup
tut nichts besonderes, sondern ignoriert das SIGHUP
Signal, leitet stdout und stderr in eine Datei um und --nur in einigen Varianten, wie den nohup
von GNU coreutils-- leitet den stdin von /dev/null
geö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/null
wenn 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 time
der nohup
Ablauf:
$ 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.sh
hat einfach sleep 10
als 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..."