2010-08-06 7 views
16

У меня есть работа cron, которая будет работать некоторое время, и я хотел бы просмотреть ее stdout. Я не знаю, насколько важен тот факт, что процесс был запущен cron, но я полагаю, что я бы сказал об этом. Это на OSX, поэтому у меня нет доступа к таким вещам, как .../proc/[pid]/..., или ферма, или strace. Рекомендации по выполнению с перенаправлением ввода-вывода (например, script > output & tail -f output) НЕ приемлемы, поскольку этот процесс 1) уже запущен и 2) не может быть остановлен/перезапущен с перенаправлением. Если есть общие решения, которые будут работать в разных Unices, это было бы идеально, но в частности я пытаюсь выполнить это на Mac прямо сейчас.Как я могу записать stdout из процесса, который УЖЕ работает

+0

Вы пытались присоединить процесс к gdb и перенаправить на стандартный вывод? Вот связанные сообщения: http://stackoverflow.com/questions/249703/how-can-a-process-intercept-stdout-and-stderr-of-another-process-on-linux и http: // stackoverflow. ком/вопросы/2874613/gdbosx-перенаправлении-стандартный вывод, может, причинно-Printf бы иметь-а-214-байт-буфер. К сожалению, после игры с ним немного, у меня не было успеха с перенаправлением сам stdout. Но я не очень хорошо разбираюсь в gdb. –

ответ

27

Истинное решение для OSX

Написать следующую функцию в вашей ~/.bashrc или ~/.zshrc.

capture() { 
    sudo dtrace -p "$1" -qn ' 
     syscall::write*:entry 
     /pid == $target && arg0 == 1/ { 
      printf("%s", copyinstr(arg1, arg2)); 
     } 
    ' 
} 

Использование:

[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

Примечание:

Вы должны отключить dtrace ограничение на El Capitan или более поздней версии.

csrutil enable --without dtrace 
+0

Спасибо. 5+ лет спустя, но это действительно работает. Очень жаль, что ответ Марка Ренуфа был настолько высоко оценен. Хотя это может работать и на системах * nix, это было совсем не вопросом. – theraccoonbear

+3

добавил это в '~/.profile', и он сразу сработал! – wrossmck

+0

делает это захват stdout и stderr или просто stdout? –

0

Я думаю, что факт, который вы начали с cron, может спасти вас. Под linux любой стандартный вывод задания cron отправляется на почтовую учетную запись unix пользователя, которому принадлежит задание. Однако не уверен в OSX. К сожалению, вам нужно будет дождаться завершения задания до отправки почты, и вы сможете просмотреть результат.

+0

К сожалению, это был (был) длительный процесс, и я хотел получить выход до того, как его длительное время работы было завершено. – theraccoonbear

18

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Не знаю, есть ли у Mac это. Этот метод существует в Linux. YMMV.

Вы можете получить стандартный вывод/ERR из/Proc (при условии наличия соответствующих прав):

PID=$(pidof my_process) 
tail -f /proc/$PID/fd/1 

Или захватить все оставшиеся в буфере файла:

cat /proc/$PID/fd/1 

PS: Fd/1 является stdout, fd/2 - stderr.


EDIT: Alex brown> Mac не имеет этого, но это полезный совет для Linux.

+2

с моего вопроса: Это на OSX, поэтому у меня нет доступа к таким вещам, как .../proc/[pid]/ – theraccoonbear

+4

i f @ cking люблю тебя. – j03m

+5

'tail -f/proc/$ PID/fd/1' ничего не печатает для меня ... на LInux – ernesto

1

neercs имеет возможность «захватывать» программы, которые были запущены за ее пределами. Возможно, это сработает для вас. Кстати, у вас нет фермы или strace, но у вас есть dtrace.

+0

Я установил libcaca и смог получить neercs, чтобы найти его, но neercs ./configure не работает, начиная с : lock.c: 26: 29: error: pam/pam_appl.h: Нет такого файла или каталога, а затем сообщает о ряде других ошибок, связанных с PAM. – theraccoonbear

1

использование dtruss -p <PID>, или даже rwsnoop -p <PID>.

Смежные вопросы