Назад | Перейти на главную страницу

Как я могу перенаправить stdout / stderr уже запущенного процесса?

(Работает на 64-битном сервере Ubuntu 10.04)

Вчера я совершил ошибку, запустив процесс (который, как я не понимал, займет несколько дней) через SSH без использования screen. Я потратил сегодня весь день, пытаясь выяснить, каким образом я могу извлечь вывод процесса из железной хватки SSH, чтобы я мог перезагрузить свою клиентскую машину, но ничего не добился.

Я пробовал использовать gdb и следовал инструкциям внизу эта страница, но когда я запускаю первую команду gdb для создания файла, я получаю сообщение об ошибке No symbol table is loaded. Use the "file" command. Из того, что я собрал, это означает, что мне нужно перекомпилировать программу, вывод которой я пытаюсь перенаправить, что, конечно, мне совершенно не помогает сейчас, когда она уже запущена.

Я также подумал, что смогу использовать retty для перенаправления вывода на другой терминал, но, очевидно, он не компилируется на 64-битных платформах.

Как я могу перенаправить вывод этого процесса на другой терминал или в файл?

Похоже, что инструкции для gdb неверны и неполны по нескольким причинам.

Во-первых, вам нужно использовать

gdb [executablefile] [pid]

чтобы GDB знал, к какой программе он на самом деле подключается является. Я только что протестировал это, и он может использовать урезанный исполняемый файл. Обратите внимание, что пока к процессу подключен gdb, процесс будет приостановлен. Если этот процесс обменивается данными по сети, введите быстро, иначе сетевое соединение, вероятно, прервется.

Во-вторых, данные команды не объясняют какие они делают, и инструкция, которую вы должны cd "в каталог, в который вы хотите, чтобы ваша программа записывала файлы", неверна, поскольку gdb просит исходную программу выполнить creat() функция. В данном примере файлы myprog.stderr и myprog.stdout будут созданы в текущем рабочем каталоге запущенной программы, а не в каталоге, в котором вы запустили gdb. Используйте здесь абсолютные пути, если вы не знаете, что такое CWD этой программы (или посмотрите на ls -l /proc/[pid]/cwd).

В-третьих, без объяснения причин, важно знать, что первый параметр dup2() номер дескриптора файла, возвращенный предыдущим creat() поэтому, если в этой запущенной программе было открыто несколько файлов, вы могли бы получить обмен, например

(gdb) call creat("/home/me/myprog.stdout",0600)
$1 = 7
(gdb) call dup2(7,1)
$2 = 1
(gdb) call creat("/home/me/myprog.stderr",0600)
$3 = 8
(gdb) call dup2(8,2)
$4 = 2

Когда вы выйдете из GDB, он спросит вас, хотите ли вы «все равно выйти (и отсоединить)», ответ - да.

В заключение, bg и disown являются встроенными в bash. Если вы не использовали bash, то вы здесь сами по себе. bg перемещает приостановленное задание в фон, как если бы оно было запущено там, используя somecommand &, и disown удаляет программу из списка активных программ bash в состояние SIGHUP при выходе из bash.

Вы можете использовать переадресацию (https://github.com/jerome-pouiller/reredirect/).

Тип

reredirect -m FILE PID

а выходные данные (стандартные и ошибочные) будут записаны в ФАЙЛ.

reredirect README также объясняет, как восстановить исходное состояние процесса, как перенаправить на другую команду или перенаправить только stdout или stderr.

Вы ничего не можете сделать удаленно. Войдите на другой сервер, используя ssh и ту же учетную запись, которая использовалась для запуска процесса. Вы сможете управлять процессом из нового сеанса.