Как я могу захватить stdout из процесса, который УЖЕ работает

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

Ответы

Ответ 1

Истинное решение для 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

Ответ 2

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Не знаю, есть ли у 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.


EDIT: Alex brown > Mac не имеет этого, но это полезный совет для Linux.

Ответ 3

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

Ответ 4

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

Ответ 5

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