script - tuberias y filtros en linux
¿Cómo redirigir la salida del comando de tiempo a un archivo en Linux? (11)
Solo una pequeña pregunta sobre los programas de tiempo en Linux: el comando de tiempo permite medir el tiempo de ejecución de un programa:
[ed@lbox200 ~]$ time sleep 1
real 0m1.004s
user 0m0.000s
sys 0m0.004s
Lo cual funciona bien. Pero si intento redirigir la salida a un archivo, falla.
[ed@lbox200 ~]$ time sleep 1 > time.txt
real 0m1.004s
user 0m0.001s
sys 0m0.004s
[ed@lbox200 ~]$ cat time.txt
[ed@lbox200 ~]$
Sé que hay otras implementaciones de tiempo con la opción -o para escribir un archivo, pero mi pregunta es sobre el comando sin esas opciones.
Alguna sugerencia ?
Ajustar el time
y el comando que está cronometrando en un conjunto de corchetes.
Por ejemplo, los siguientes tiempos ls
y escribe el resultado de ls
y los resultados del tiempo en outfile
:
$ (time ls) > outfile 2>&1
O bien, si desea separar la salida del comando de la salida capturada desde el time
:
$ (time ls) > ls_results 2> time_results
Dado que el resultado del comando ''time'' es la salida de error, redirigirlo como salida estándar sería más intuitivo para hacer más procesamiento.
{ time sleep 1; } 2>&1 | cat > time.txt
Sencillo. La utilidad de time
GNU tiene una opción para eso.
Pero debes asegurarte de que no estás usando el comando de time
incorporado de tu caparazón, ¡al menos el bash
incorporado no proporciona esa opción! Es por eso que necesita dar la ruta completa de la herramienta de time
:
/usr/bin/time -o time.txt sleep 1
Si está utilizando csh
puede usar:
/usr/bin/time --output=outfile -p $SHELL -c ''your command''
Por ejemplo:
/usr/bin/time --output=outtime.txt -p csh -c ''cat file''
Si le importa la salida de error del comando, puede separarlos así mientras sigue usando el comando de tiempo incorporado.
{ time your_command 2> command.err ; } 2> time.log
o
{ time your_command 2>1 ; } 2> time.log
Como puede ver, los errores del comando van a un archivo (ya que stderr
se usa por time
).
Desafortunadamente no puedes enviarlo a otro controlador (como 3>&2
) ya que eso ya no existirá fuera del {...}
Dicho eso, si puedes usar el tiempo de GNU, simplemente haz lo que dijo @Tim Ludwinski.
/time -o time.log command
Si no desea tocar el proceso original ''stdout and stderr, puede redireccionar stderr al descriptor de archivo 3 y regresar:
$ { time { perl -le "print ''foo''; warn ''bar'';" 2>&3; }; } 3>&2 2> time.out
foo
bar at -e line 1.
$ cat time.out
real 0m0.009s
user 0m0.004s
sys 0m0.000s
Puede usarlo para un contenedor (por ejemplo, para cronjobs) para monitorear tiempos de ejecución:
#!/bin/bash
echo "[$(date)]" "$@" >> /my/runtime.log
{ time { "$@" 2>&3; }; } 3>&2 2>> /my/runtime.log
Si usa tiempo de GNU en lugar de bash incorporado, pruebe
time -o outfile command
(Nota: los formatos de tiempo GNU son un poco diferentes a los bash incorporados).
Terminé usando:
/usr/bin/time -ao output_file.txt -f "Operation took: %E" echo lol
- Donde se agrega "a"
- Donde "o" es procesada por el nombre del archivo para agregar a
- Donde "f" es formato con una sintaxis similar a printf
- Donde "% E" produce 0:00:00; horas: minutos: segundos
- Tuve que invocar / usr / bin / time porque el "tiempo" bash lo estaba pisoteando y no tiene las mismas opciones
- Solo estaba tratando de obtener salida al archivo, no es lo mismo que OP
Tratar
{ time sleep 1 ; } 2> time.txt
que combina el STDERR de "tiempo" y tu comando en time.txt
O usar
{ time sleep 1 2> sleep.stderr ; } 2> time.txt
que pone STDERR de "dormir" en el archivo "sleep.stderr" y solo STDERR de "tiempo" entra en "time.txt"
#!/bin/bash
set -e
_onexit() {
[[ $TMPD ]] && rm -rf "$TMPD"
}
TMPD="$(mktemp -d)"
trap _onexit EXIT
_time_2() {
"$@" 2>&3
}
_time_1() {
time _time_2 "$@"
}
_time() {
declare time_label="$1"
shift
exec 3>&2
_time_1 "$@" 2>"$TMPD/timing.$time_label"
echo "time[$time_label]"
cat "$TMPD/timing.$time_label"
}
_time a _do_something
_time b _do_another_thing
_time c _finish_up
Esto tiene el beneficio de no descascarar caparazones secundarios, y la tubería final tiene su estructura restaurada en la línea real.
&>out time command >/dev/null
en tu caso
&>out time sleep 1 >/dev/null
entonces
cat out