У меня есть работа 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>
.
- 1. Как я могу записать вывод stdout дочернего процесса?
- 2. захват stderr и stdout из уже запущенного процесса в solaris
- 3. C# Захват уже запущенного процесса STDOut
- 4. Как я могу записать атомную запись в stdout в python?
- 5. В Go, как я могу записать stdout функции в строку?
- 6. Как записать stdout сборки ST3?
- 7. Bash: перенаправление вывода из процесса, который уже запущен?
- 8. Мониторинг процесса, который уже запущен
- 9. Как я могу записать в другую память процесса?
- 10. Python Scripting - Как я могу запустить подпроцесс и передать stdout этого процесса на stdout сценария Python
- 11. Как я могу записать stdin и stdout из системной команды из Perl-скрипта?
- 12. Как записать в stdin/read из stdout SSH-подключенного удаленного процесса? (Renci.SshNet)
- 13. Синхронное чтение stdout процесса
- 14. Чтение stdout из процесса (linux embedded)
- 15. Программно перенаправлять stdout запущенного процесса?
- 16. Получить stdout уже запущенного процесса в Linux в C
- 17. Как я правильно прочитал вывод дочернего процесса stdout/stderr?
- 18. Ocaml lwt читает stdout из другого процесса
- 19. Как получить объект процесса уже запущенного процесса?
- 20. Как захватить stdout из других очков?
- 21. Как записать вывод stdout из вызова функции Python?
- 22. Одновременно потреблять stdout из внешнего процесса
- 23. Как я могу прочитать выход дочернего процесса?
- 24. Windows Как получить процессную группу процесса, который уже запущен?
- 25. Как я могу проверить stdin и stdout?
- 26. Как записать вывод stdout в Tomcat?
- 27. Что я могу использовать для чтения из STDIN/записи в STDOUT дочернего процесса?
- 28. Почему не выполняется stdout после выполнения дочернего процесса в скрипте node.js, который работает как демон?
- 29. Как я могу тайм-аут раздвоенного процесса, который может зависать?
- 30. Как я могу получить «Задержка» процесса, который имеет TCP-соединение?
Вы пытались присоединить процесс к 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. –