У меня есть работа cron, которая будет работать некоторое время, и я хотел бы просмотреть ее stdout. Я не знаю, насколько важен тот факт, что процесс был запущен cron, но я полагаю, что я бы сказал об этом. Это на OSX, поэтому у меня нет доступа к таким вещам, как .../proc/[pid]/..., или ферма, или strace. Рекомендации по выполнению с перенаправлением ввода-вывода (например, script > output & tail -f output
) НЕ приемлемы, поскольку этот процесс 1) уже запущен и 2) не может быть остановлен/перезапущен с перенаправлением. Если есть общие решения, которые будут работать в разных Unices, это было бы идеально, но в частности я пытаюсь выполнить это на Mac прямо сейчас.Как я могу записать stdout из процесса, который УЖЕ работает
ответ
Истинное решение для 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
Спасибо. 5+ лет спустя, но это действительно работает. Очень жаль, что ответ Марка Ренуфа был настолько высоко оценен. Хотя это может работать и на системах * nix, это было совсем не вопросом. – theraccoonbear
добавил это в '~/.profile', и он сразу сработал! – wrossmck
делает это захват stdout и stderr или просто stdout? –
Я думаю, что факт, который вы начали с cron, может спасти вас. Под linux любой стандартный вывод задания cron отправляется на почтовую учетную запись unix пользователя, которому принадлежит задание. Однако не уверен в OSX. К сожалению, вам нужно будет дождаться завершения задания до отправки почты, и вы сможете просмотреть результат.
К сожалению, это был (был) длительный процесс, и я хотел получить выход до того, как его длительное время работы было завершено. – theraccoonbear
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Не знаю, есть ли у 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.
с моего вопроса: Это на OSX, поэтому у меня нет доступа к таким вещам, как .../proc/[pid]/ – theraccoonbear
i f @ cking люблю тебя. – j03m
'tail -f/proc/$ PID/fd/1' ничего не печатает для меня ... на LInux – ernesto
neercs имеет возможность «захватывать» программы, которые были запущены за ее пределами. Возможно, это сработает для вас. Кстати, у вас нет фермы или strace, но у вас есть dtrace.
Я установил libcaca и смог получить neercs, чтобы найти его, но neercs ./configure не работает, начиная с : lock.c: 26: 29: error: pam/pam_appl.h: Нет такого файла или каталога, а затем сообщает о ряде других ошибок, связанных с PAM. – theraccoonbear
использование dtruss -p <PID>
, или даже rwsnoop -p <PID>
.
Вы пытались присоединить процесс к 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. –