Просмотреть вывод уже запущенных процессов в Linux

У меня есть процесс, который работает в фоновом режиме (sh script), и мне интересно, можно ли просмотреть результат этого процесса без его прерывания.

Процесс запускается некоторым приложением, иначе я бы привязал его к экрану для последующего просмотра. Это может занять час, и я хочу убедиться, что он работает нормально, без ошибок.

Ответ 1

Существует уже программа, которая использует ptrace (2) в linux для этого, retty:

http://pasky.or.cz/dev/retty/

Это работает, если ваша запущенная программа уже привязана к tty, я не знаю, будет ли она работать, если вы запустите свою программу в фоновом режиме.

По крайней мере, это может дать некоторые хорошие советы.:)

Возможно, вы, возможно, вернете код выхода из программы с помощью ptrace(2), иначе просто присоединитесь к процессу с помощью gdb -p <pid>, и он будет напечатан, когда программа умрет.

Вы также можете манипулировать файловыми дескрипторами с помощью gdb:

(gdb) p close(1)
$1 = 0
(gdb) p creat("/tmp/stdout", 0600)
$2 = 1

http://etbe.coker.com.au/2008/02/27/redirecting-output-from-a-running-process/

Ответ 2

Вы можете попытаться подключиться к тройке /proc/[pid]/fd/[012], но, вероятно, это не сработает.

Следующая идея, которая появляется у меня на ум, - strace -p [pid], но вы получите "приглушенный" вывод. Возможное решение состоит в том, чтобы спрятать себя, написав небольшую программу, используя ptrace(2), чтобы подключиться к write(2) и записать данные где-нибудь. Он будет работать, но не выполняется всего за несколько секунд, особенно если вы не используете программирование C.

К сожалению, я не могу придумать программу, которая делает именно то, что вы хотите, поэтому я даю вам подсказку, как написать ее самостоятельно. Удачи!