Как я могу захватить 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. К сожалению, вам нужно будет дождаться завершения задания до отправки почты, и вы можете просмотреть результат.