Dê uma olhada na saída `at` antes de concluir

8

Digamos que eu execute um script atno Linux (exemplo abaixo) que eu sei que levará várias horas, ou talvez até vários dias. Estou acostumado a atenviar um email com a saída do comando, uma vez concluído, mas e se eu quisesse espiar a saída atual antes de ela ser concluída? Vamos supor também que eu já executar o script e se esqueceu de redirecionar a saída usando tail, teeou outros métodos semelhantes e não quer parar o script. Existe alguma maneira de fazer isso?

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
fonte
pico ou espiada? Você quer ver o que está fazendo enquanto está fazendo?
Journeyman Geek
@JourneymanGeek, Ops. Espiar seria o que eu pretendia digitar. Eu quero ver o que está fazendo.
Tirou Chapin
Redirecionar a saída do script para um arquivo quando você agendar o trabalho at e tail -fesse arquivo?
Muru
@uru, vamos fingir que eu já executei o script sem usar taile não quero pará-lo.
Tirou Chapin
Eu precisaria testar, mas modificaria o script para usar o tee e salvaria a saída em um arquivo e, em seguida, o seguiria?
Journeyman Geek

Respostas:

9

Se o trabalho foi iniciado e você tem alguma maneira de obter o PID desse trabalho, você pode ver onde atestá salvando a saída:

$ 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 você pode ver, a saída é salva em um arquivo temporário, que agora você pode verificar:

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

Você precisa sudoporque o diretório que contém não é acessível ao mundo (pelo menos no 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
fonte
1
Você senhor, é meu heroi! Isso funcionou perfeitamente!
Tirou Chapin
4
Gostaria de acrescentar, porém, que se você souber que está executando apenas um attrabalho. Você nem precisa do PID. Você pode simplesmente executar sudo ls /var/spool/cron/atspoole, em teoria, deve ser o único arquivo lá.
Tirou Chapin
0

Outra maneira de determinar qual arquivo de spool pertence ao seu trabalho é obter o número do trabalho atq.

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

Converta o número do trabalho em hexadecimal. por exemplo 38 (dec) = 26 (hex).

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

Seu arquivo será nomeado como letra da fila (99% do tempo a), seguido de uma identificação de trabalho hexadecimal de 5 dígitos (eu aprendi isso pesquisando o código-fonte do 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
                                              -----

Então você pode ver o stdout

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