Как я могу захватить стандартный вывод из процесса, который уже запущен

У меня есть работа 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.

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

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

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

Другие вопросы по тегам