Как я могу захватить стандартный вывод из процесса, который уже запущен - PullRequest
22 голосов
/ 06 августа 2010

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

Ответы [ 5 ]

37 голосов
/ 21 ноября 2015

Истинное решение для 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 для El Capitan или более поздней версии.

csrutil enable --without dtrace
20 голосов
/ 21 апреля 2011

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

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

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

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

cat /proc/$PID/fd/1

PS: fd / 1 - это stdout, fd / 2 - это stderr.


РЕДАКТИРОВАТЬ: Алекс Браун> В Mac этого нет, но это полезный совет для Linux.

3 голосов
/ 03 апреля 2014

используйте dtruss -p <PID> или даже rwsnoop -p <PID>.

1 голос
/ 21 апреля 2011

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

0 голосов
/ 09 апреля 2011

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

...