2008-10-14 22 views
10

Estoy tratando de capturar la salida de una secuencia de comandos de instalación (que usa scp) y registrarla. Sin embargo, no estoy obteniendo todo lo que scp está imprimiendo, es decir, la barra de progreso.¿Cómo capturar y registrar mejor la salida de scp?

salida

pantalla:

copia /usuario2/CDB/construye/tmp/UAT/myfiles/* a servidor/usuarios/myfiles como CDB

contraseña cdb de @ servidor: mi_archivo 100 % | ***************************** | 2503 00:00

salida del registro:

copia /usuario2/CDB/construye/tmp/UAT/myfiles/* a servidor/usuarios/myfiles como CDB

Realmente me gustaría saber que mi archivo llegó allí. Esto es lo que estoy intentando ahora en vano:

myscript.sh 2> & 1 | tee mylogfile.log

¿Alguien tiene una buena manera de capturar la salida de scp y registrarla?

Gracias.

Respuesta

7

Parece que su falta de si el scp fue exitoso o no desde el registro.

Supongo que la barra de desplazamiento no imprime en stdout y usa ncurses o algún otro tipo de TUI?

Puedes simplemente mirar el valor de retorno de scp para ver si fue exitoso. Al igual que

scp myfile [email protected]:. && echo success! 

man scp dice

scp exits with 0 on success or >0 if an error occurred. 
1

Quizás pueda usar 'script' para registrar la sesión del terminal.

0

sí lo hace poco estaba tratando de obtener una salida dentro de un script php de proc_open() he perdido una vez tranquila tratando de obtener una salida :-) pero su un poco tarde aquí y luego leyendo este post aquí me hizo darme cuenta de que realmente no necesito esta salida junky a mi script

solo el código de salida hará el trabajo :-)

$ exit_code = proc_close ($ process);

20

scp imprime su barra de progreso en el terminal utilizando los códigos de control. Detectará si redirige la salida y omite así la barra de progreso.

Usted puede conseguir alrededor de ese engañando SCP haciéndole creer que se ejecuta en un terminal con el comando "guión" que está instalado en la mayoría de distribuciones de forma predeterminada:

script -q -c "scp server:/file /tmp/" > /tmp/test.txt 

El contenido de test.txt habrá:

file 0% 0  0.0KB/s --:-- ETA 
file 18% 11MB 11.2MB/s 00:04 ETA 
file 36% 22MB 11.2MB/s 00:03 ETA 
file 54% 34MB 11.2MB/s 00:02 ETA 
file 73% 45MB 11.2MB/s 00:01 ETA 
file 91% 56MB 11.2MB/s 00:00 ETA 
file 100% 61MB 10.2MB/s 00:06 

... que es probablemente lo que usted quiere.

Me tropecé con este problema al redirigir el resultado de una secuencia de comandos interactiva en un archivo de registro. No tener los resultados en el registro no fue un problema ya que siempre se pueden evaluar los códigos de salida. Pero realmente quería que el usuario interactivo viera la barra de progreso. Esta respuesta resuelve ambos problemas.

+0

Cuidado: es posible que desee utilizar la opción '--return' (' -r') para 'script', si está disponible, de modo que se conservará el código de retorno del proceso hijo. De lo contrario, incluso si el comando falla, su comando 'script' felizmente devolverá un código de éxito. – jwd

1
scp myfile [email protected]:. && echo success! 

es muy útil, pero para escribir el mensaje en un archivo de registro que lo cambié como esto

scp myfile [email protected]:. && echo myfile successfully copied! >> logfile 2>&1 

y esto escribirá "myFile copiado con éxito!" mensaje al archivo de registro.

0

Probar:

scp server:/file /tmp/ > /dev/tty 
+0

Agregar una explicación de esta respuesta sería una buena idea. (También me parece poco probable que obtenga el resultado en su archivo de registro). –

0

que no puedo comentar aún :(así que voy a añadir una actualización aquí ...

@ Martin tuvo la mejor solución para mí, aunque si su comando scp es a medio camino a través de su escritura, entonces es la salida puede aparecer después de comandos que en realidad se acabó después.

Creo que es porque la escritura debe ejecutar el comando en un subnivel pero todavía estoy a prueba.

EDITAR: de hecho genera un shell por lo que si necesita ejecutar cosas (y de hecho fallar) de forma secuencial (como en un script de compilación), entonces debería agregar algo de lógica sobre el uso del comando de script.

decir

guión -q -c "el comando" & & del sueño 1

o algo similar para que sus padres shell espera para el shell hijo que termine antes de continuar.

+0

script -qc 'sleep 10' bloquea la ejecución en mi sistema, mientras que echo | script -qc 'dormir 10' no.Solución alternativa: echo | script -qc 'dormir 10' | gato. Creo que los bloques shell siempre y cuando stdin/err/out sigan abiertos. – Martin

0
$ grep -r "Error" xyz.out > abc.txt 

Aquí en el comando anterior estoy almacenando la salida en el archivo abc.txt.

Este comando grep es para la búsqueda de texto containg error en el archivo xyz.out y almacenar el resultado en abc.txt sin que se muestre en la consola.

Cuestiones relacionadas