Zajrzyj do wyjścia `at` zanim się zakończy

8

Załóżmy, że uruchamiam skrypt atna Linuksie (przykład poniżej), który, jak wiem, zajmie kilka godzin, a może nawet kilka dni. Jestem przyzwyczajony do atwysyłania wiadomości e-mail z danymi wyjściowymi polecenia po jego zakończeniu, ale co zrobić, jeśli chcę zajrzeć do bieżącego wyniku przed jego zakończeniem? Załóżmy również, że już uruchomić skrypt i zapomniał przekierować wyjście używając tail, teelub innych podobnych metod i nie chcesz, aby zatrzymać skrypt. Czy jest coś takiego?

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
źródło
szczyt czy zerknięcie? Chcesz zobaczyć, co robi podczas gdy to robi?
Journeyman Geek
@JourneymanGeek, Ups. Peek będzie tym, co chciałem napisać. Chcę zobaczyć, co robi.
Drew Chapin
Przekierować dane wyjściowe skryptu do pliku podczas planowania zadania i tail -ftego pliku?
muru
@muru, Udawajmy, że już uruchomiłem skrypt bez użycia taili nie chcę go zatrzymywać.
Drew Chapin
Musiałbym przetestować, ale czy zmodyfikowałbym skrypt, aby używał tee, i zapisywał dane wyjściowe w pliku, a następnie dostosowywałby go?
Journeyman Geek

Odpowiedzi:

9

Jeśli zadanie się rozpoczęło i masz jakiś sposób na uzyskanie PID tego zadania, możesz zobaczyć, gdzie atzapisujesz dane wyjściowe:

$ 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

Jak widać, dane wyjściowe są zapisywane w pliku tymczasowym, który możesz teraz sprawdzić:

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

Potrzebujesz, sudoponieważ katalog zawierający nie jest dostępny dla całego świata (przynajmniej w 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
źródło
1
Proszę pana, jesteś moim bohaterem! To działało idealnie!
Drew Chapin
4
Chciałbym jednak dodać, że jeśli wiesz, że prowadzisz tylko jedną atpracę. Nie potrzebujesz nawet PID. Możesz po prostu uruchomić sudo ls /var/spool/cron/atspooli teoretycznie powinien to być jedyny plik.
Drew Chapin
0

Innym sposobem ustalenia, który plik buforowy należy do zadania, jest uzyskanie numeru zadania atq.

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

Konwertuj numer zadania na hex. np. 38 (dec) = 26 (hex).

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

Twój plik będzie miał nazwę Litera kolejki (99% czasu a), a następnie 5-cyfrowy identyfikator zadania heksadecymalnego (nauczyłem się tego, przeglądając kod źródłowy atpolecenia).

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
                                              -----

Następnie możesz wyświetlić standardowe wyjście

drew@sokar:~$ sudo less /var/spool/cron/atspool/a0002601856a0f
Drew Chapin
źródło