Tengo un trabajo cron en ejecución que durará un tiempo y me gustaría ver su stdout. No sé cuán importante es el hecho de que el proceso fue iniciado por cron, pero creo que lo mencionaría. Esto está en OSX entonces, no tengo acceso a cosas como .../proc/[pid]/..., o truss, o strace. Las sugerencias de ejecutar con la redirección de IO (por ejemplo, script > output & tail -f output
) NO son aceptables, porque este proceso 1) ya se está ejecutando, y 2) no se puede detener/reiniciar con la redirección. Si hay soluciones generales que funcionen en varios Unices, sería ideal, pero específicamente estoy tratando de lograr esto en una Mac en este momento.¿Cómo puedo capturar el stdout de un proceso que YA está en ejecución?
Respuesta
verdadera solución para OSX
escribir la siguiente función para su ~/.bashrc
o ~/.zshrc
.
capture() {
sudo dtrace -p "$1" -qn '
syscall::write*:entry
/pid == $target && arg0 == 1/ {
printf("%s", copyinstr(arg1, arg2));
}
'
}
Uso:
[email protected]:~$ perl -e 'STDOUT->autoflush; while (1) { print "Hello\n"; sleep 1; }' >/dev/null &
[1] 97755
[email protected]:~$ capture 97755
Hello
Hello
Hello
Hello
...
https://github.com/mivok/squirrelpouch/wiki/dtrace
NOTA:
Debe deshabilitar dtrace
restricción sobre El Capitán o posterior.
csrutil enable --without dtrace
Gracias. Más de 5 años más tarde, pero esto de hecho funciona. Es realmente una pena que la respuesta de Mark Renouf haya sido tan altamente votada. Si bien puede funcionar en sistemas * nix, ese no era el objetivo de la pregunta. – theraccoonbear
agregó esto a '~/.profile' ¡y funcionó de inmediato! – wrossmck
¿captura esto stdout y stderr o simplemente stdout? –
Creo que el hecho de que haya empezado con cron podría salvarlo. En Linux, cualquier salida estándar de un trabajo cron se envía por correo a la cuenta de correo de Unix del usuario propietario del trabajo. No estoy seguro acerca de OSX sin embargo. Lamentablemente, deberá esperar a que el trabajo finalice antes de que se envíe el correo y podrá ver el resultado.
desafortunadamente, este fue (fue) un proceso de larga ejecución y quería obtener la salida antes de que se completara su largo tiempo de ejecución. – theraccoonbear
DESCARGO DE RESPONSABILIDAD: No hay idea si Mac tiene esto. Esta técnica existe en Linux. YMMV.
se puede agarrar stdout/err desde/proc (suponiendo privilegios adecuados):
PID=$(pidof my_process)
tail -f /proc/$PID/fd/1
o agarrar todo lo que queda en la memoria intermedia en un archivo:
cat /proc/$PID/fd/1
PS: fd/1 es stdout, fd/2 es stderr.
EDIT: Alex brown> Mac no tiene esto, pero es un consejo útil para Linux.
de mi pregunta: Esto es en OSX, así que no tengo acceso a cosas como .../proc/[pid]/ – theraccoonbear
y te amo. – j03m
'tail -f/proc/$ PID/fd/1' no imprime nada para mí ... en LInux – ernesto
neercs tiene la capacidad de "capturar" los programas que se iniciaron fuera de él. Tal vez te funcione. Por cierto, no tienes truss o strace, pero sí tienes dtrace.
Tengo libcaca instalado y pude encontrar neercs para encontrarlo, pero neercs './configure está fallando, empezando por : lock.c: 26: 29: error: pam/pam_appl.h: No hay tal archivo o directorio, y luego informa varios otros errores relacionados con PAM. – theraccoonbear
use dtruss -p <PID>
, o incluso rwsnoop -p <PID>
.
- 1. ¿Cómo puedo capturar la salida stdout de un proceso hijo?
- 2. Cómo capturar stdout de otro proceso en Win32 sin latencia?
- 3. linux: ¿obteniendo umask de un proceso ya en ejecución?
- 4. Bash: redirigir la salida de un proceso que ya se está ejecutando?
- 5. Proceso de ejecución dado el proceso handle
- 6. ¿Cómo puedo establecer el foco en la aplicación que ya está en estado de ejecución?
- 7. ¿Cómo se conecta strace a un proceso ya en ejecución?
- 8. Cómo capturar un STDOUT y STDERR de proceso por línea a medida que ocurren, durante la operación del proceso. (C#)
- 9. Cómo redirigir el proceso hijo stdout/stderr al proceso principal stdout/stderr en Java?
- 10. lanzando un proceso de rubí, capturar stdout, stderr, consiguiendo existen estado
- 11. Cómo capturar stdout/stderr con googletest?
- 12. ¿Cómo veo un STDOUT de un programa en ejecución de un programa perl que lo llamó?
- 13. Detectar un proceso que ya se está ejecutando en Windows con C# .NET
- 14. ¿Cómo puedo saber si un proceso ya se está ejecutando usando C#?
- 15. Verificando un proceso php ya se está ejecutando
- 16. Cómo capturar la salida stdout/log de un agente en SLIME?
- 17. Cómo obtener contenido que ya está leído
- 18. ¿Cómo puede un proceso interceptar stdout y stderr de otro proceso en Linux?
- 19. ¿Cómo puedo poner un proceso en segundo plano después de su ejecución con CTRL + Z roto?
- 20. C#: Redirigir salida estándar de un proceso que ya se está ejecutando
- 21. ¿Puedo usar GDB para depurar un proceso en ejecución?
- 22. ¿Cómo me aseguro de que un proceso en ejecución sea el proceso que espero se esté ejecutando?
- 23. Lea otro proceso 'stdout en C++
- 24. cambio que ya está fijado el tiempo de ejecución de controlador de eventos
- 25. Excepción al abrir un archivo que ya está abierto
- 26. ¿Cómo puedo depurar un proceso win32 que inesperadamente termina en silencio?
- 27. ¿Puedo crear un pthread dentro de un pthread, que ya está creado por el principal?
- 28. ¿Matar un proceso en ejecución en ColdFusion?
- 29. Proceso de ejecución larga que devolverá un archivo
- 30. Multiprocesamiento Python: ¿Cómo puedo redireccionar FIABLY stdout de un proceso hijo?
¿Ha intentado adjuntar el proceso a gdb y redirigir la stdout? Aquí están las publicaciones relacionadas: http://stackoverflow.com/questions/249703/how-can-a-process-intercept-stdout-and-stderr-of-another-process-on-linux y http: // stackoverflow. com/questions/2874613/gdbosx-redirecting-stdout-may-cause-printf-to-have-a-214-bytes-buffer. Lamentablemente, después de jugar con él un poco, no tuve éxito al redirigir el stdout yo mismo. Pero no soy muy fluido en gdb. –