Посмотрите на `at`, прежде чем он завершится

610
Drew Chapin

Допустим, я запускаю скрипт atна Linux (пример ниже), который, как я знаю, займет несколько часов или, может быть, даже несколько дней. Я привык atпосылать электронное письмо с выводом команды после ее завершения, но что если я захочу посмотреть текущий результат до его завершения? Давайте также предположим, я уже запустить сценарий и забыл перенаправить вывод, используя tail, teeили другие подобные методы, и не хотят, чтобы остановить скрипт. Есть ли в любом случае, чтобы сделать это?

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 
9
пик или заглянуть? Вы хотите увидеть, что он делает, пока он это делает? Journeyman Geek 7 лет назад 0
@JourneymanGeek, упс Peek будет то, что я хотел напечатать. Я хочу посмотреть, что он делает. Drew Chapin 7 лет назад 0
Перенаправить вывод скрипта в файл, когда вы запланируете at at job и `tail -f` этот файл? muru 7 лет назад 0
@muru, давайте представим, что я уже запустил скрипт без использования `tail` и не хочу его останавливать. Drew Chapin 7 лет назад 0
Мне нужно протестировать, но нужно ли изменить сценарий, чтобы использовать его, и сохранить результат в файл, а затем настроить его? Journeyman Geek 7 лет назад 0
@JourneymanGeek, я ищу способ сделать это, когда я забыл перенаправить вывод в сценарии и не хочу останавливать сценарий. Я обновил вопрос с этой деталью. Drew Chapin 7 лет назад 0

2 ответа на вопрос

9
muru

Если задание началось, и у вас есть какой-то способ получить PID этого задания, вы можете увидеть, где atсохраняется вывод:

$ 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 

Как видите, вывод сохраняется во временном файле, который вы теперь можете проверить:

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

Вы нуждаетесь, sudoпотому что содержащий каталог не является общедоступным (по крайней мере, в 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 
Вы, сэр, мой герой! Это сработало отлично! Drew Chapin 7 лет назад 1
Я хотел бы добавить, что, если вы знаете, что вы выполняете только одну `at` работу. Вам даже не нужен PID. Вы можете просто запустить `sudo ls / var / spool / cron / atspool`, и он, теоретически, должен быть единственным файлом там. Drew Chapin 7 лет назад 4
0
Drew Chapin

Другой способ определить, какой файл буфера принадлежит вашей работе, - получить номер задания atq.

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

Преобразовать номер задания в гекс. например, 38 (dec) = 26 (hex).

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

Ваш файл будет называться буквой очереди (в 99% случаев a), за ним следует шестизначный шестнадцатеричный идентификатор задания (я узнал об этом, просматривая исходный код atкоманды).

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

Тогда вы можете просмотреть стандартный вывод

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

Похожие вопросы