Mire la salida `at` antes de que se complete

8

Digamos que ejecuto un script con atLinux (ejemplo a continuación) que sé que tomará varias horas, o tal vez incluso varios días. Estoy acostumbrado a atenviar un correo electrónico con la salida del comando una vez que se completa, pero ¿y si quisiera echar un vistazo a la salida actual antes de que se complete? Supongamos también que ya he encontrado el guión y se olvidó de redirigir la salida usando tail, teeu otros métodos similares y no quiero detener el script. ¿Hay alguna forma de hacer esto?

drew@anubis:~$ at now
warning: commands will be executed using /bin/sh
at> ./myscript.sh
at> <EOT>
job 3 at Sat Jan  7 09:31:00 2017
Drew Chapin
fuente
pico o vistazo? ¿Quieres ver qué hace mientras lo hace?
Journeyman Geek
@JourneymanGeek, ¡Vaya! Peek sería lo que quería escribir. Quiero ver qué está haciendo.
Drew Chapin
¿Redirige la salida del script a un archivo cuando programa el trabajo y tail -fese archivo?
muru
@muru, imaginemos que ya ejecuté el script sin usarlo taily no quiero detenerlo.
Drew Chapin
Necesitaría probar, pero ¿modificaría el script para usar tee, y guardaría la salida en un archivo, y luego seguirlo?
Journeyman Geek

Respuestas:

9

Si el trabajo ha comenzado y tiene alguna forma de obtener el PID de ese trabajo, podría ver dónde atestá guardando la salida:

$ at now
warning: commands will be executed using /bin/sh
at> sleep 10m
at> <EOT>
job 7 at Sat Jan  7 20:18:00 2017
$ pgrep sleep
7582
$ ls -l /proc/7582/fd
total 0
lr-x------ 1 muru muru 64 Jan  7 20:19 0 -> /var/spool/cron/atjobs/a0000701795998 (deleted)
lrwx------ 1 muru muru 64 Jan  7 20:19 1 -> /var/spool/cron/atspool/a0000701795998
lrwx------ 1 muru muru 64 Jan  7 20:19 2 -> /var/spool/cron/atspool/a0000701795998

Como puede ver, la salida se guarda en un archivo temporal, que ahora puede verificar:

$ sudo tail -f /var/spool/cron/atspool/a0000701795998
Subject: Output from your job        7
To: muru

Necesita sudoporque el directorio que contiene no es accesible al mundo (al menos en Ubuntu 14.04):

$ sudo namei -lx /var/spool/cron/atspool/a0000701795998
f: /var/spool/cron/atspool/a0000701795998
Drwxr-xr-x root     root   /
drwxr-xr-x root     root   var
drwxr-xr-x root     root   spool
drwxr-xr-x root     root   cron
drwxrwx--T daemon   daemon atspool
-rw------- muru     muru   a0000701795998
muru
fuente
1
¡Usted señor, es mi héroe! Eso funcionó perfectamente!
Drew Chapin
44
Sin embargo, me gustaría agregar que si sabes que solo estás ejecutando un attrabajo. Ni siquiera necesitas el PID. Simplemente puede ejecutar sudo ls /var/spool/cron/atspooly debería, en teoría, ser el único archivo allí.
Drew Chapin
0

Otra forma de determinar qué archivo de spool pertenece a su trabajo es obtener el número de trabajo atq.

drew@sokar:~$ atq
38      Tue Jul 10 12:15:00 2018 = drew

Convierta el número de trabajo a hexadecimal. por ejemplo, 38 (dec) = 26 (hex).

drew@sokar:~$ printf "%x\n" 38
26

Su archivo se denominará letra de cola (el 99% del tiempo, es a) seguido de una identificación de trabajo hexadecimal de 5 dígitos (lo aprendí mirando el código fuente del atcomando).

drew@sokar:~$ sudo ls -l /var/spool/cron/atspool
total 55968
-rw------- 1 drew drew       49 Feb 16  2017 a0001c017a3cb2
-rw------- 1 drew drew 57297586 Feb 26  2017 a0001e017a7405
-rw------- 1 drew drew     2329 Jul 10 12:21 a0002601856a0f
                                              -----

Entonces puedes ver el stdout

drew@sokar:~$ sudo less /var/spool/cron/atspool/a0002601856a0f
Drew Chapin
fuente