Как я могу захватить стандартный вывод из процесса, который уже запущен
У меня есть работа cron, которая будет выполняться некоторое время, и я хотел бы просмотреть ее стандартный вывод. Я не знаю, насколько важен тот факт, что процесс был запущен cron, но я думаю, что упомянул бы об этом. Это на OSX, поэтому у меня нет доступа к таким вещам, как... /proc/[pid]/..., или ферма, или strace. Предложения по выполнению с перенаправлением ввода-вывода (например, script > output & tail -f output
) НЕ приемлемы, потому что этот процесс 1) уже запущен и 2) не может быть остановлен / перезапущен с перенаправлением. Если есть общие решения, которые будут работать в разных Unix-системах, это было бы идеально, но конкретно я пытаюсь сделать это на Mac прямо сейчас.
5 ответов
Истинное решение для OSX
Напишите следующую функцию ~/.bashrc
или же ~/.zshrc
,
capture() {
sudo dtrace -p "$1" -qn '
syscall::write*:entry
/pid == $target && arg0 == 1/ {
printf("%s", copyinstr(arg1, arg2));
}
'
}
Использование:
example@localhost:~$ perl -e 'STDOUT->autoflush; while (1) { print "Hello\n"; sleep 1; }' >/dev/null &
[1] 97755
example@localhost:~$ capture 97755
Hello
Hello
Hello
Hello
...
https://github.com/mivok/squirrelpouch/wiki/dtrace
НОТА:
Вы должны отключить dtrace
ограничение на Эль-Капитан или позже.
csrutil enable --without dtrace
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Понятия не имею, есть ли у Mac это. Эта техника существует в Linux. YMMV.
Вы можете получить stdout / err из /proc (при условии наличия надлежащих привилегий):
PID=$(pidof my_process)
tail -f /proc/$PID/fd/1
Или захватите все, что осталось в буфере, в файл:
cat /proc/$PID/fd/1
PS: fd / 1 - стандартный вывод, fd/2 - стандартный вывод.
РЕДАКТИРОВАТЬ: Алекс Браун> Mac не имеет этого, но это полезный совет для Linux.
neercs имеет возможность "захватывать" программы, которые были запущены вне его. Возможно, это будет работать для вас. Кстати, у вас нет фермы или связки, но у вас есть трассировка.
Я думаю, что тот факт, что вы начали с cron, может спасти вас. В Linux любой стандартный вывод задания cron отправляется на почтовую учетную запись unix пользователя, которому принадлежит задание. Не уверен насчет OSX, хотя. К сожалению, вам нужно будет дождаться окончания работы, прежде чем письмо будет отправлено, и вы сможете просмотреть результаты.