Как перенаправить вывод уже запущенного процесса [дубликат]

Никогда не делайте преждевременное предположение как, другой код приложения и использование могут повлиять на Вашу функцию. Так рассмотрение функции является изоляцией, бесполезно.

, Если Вы серьезны с приложением затем VTune это или используете какой-либо подобный профильный инструмент и смотрите на горячие точки.

Ketan

136
задан Sheldon Ross 24 August 2009 в 18:43
поделиться

2 ответа

См. Перенаправление вывода из запущенного процесса .

Сначала я запускаю команду cat> foo1 в одном сеансе и проверяю эти данные из stdin копируется в файл. Затем в другом сеансе я перенаправляю вывод.

Сначала нахожу PID процесса:

 $ ps aux | grep cat
rjc 6760 0,0 0,0 1580 376 очков / 5 S + 15:31 0:00 кот

Теперь проверьте дескрипторы файлов, которые он открыл:

 $ ls -l / proc / 6760 / fd
всего 3
lrwx—— 1 rjc rjc 64 27 февраля, 15:32 0 -> / dev / pts / 5
l-wx—— 1 rjc rjc 64 27 февраля, 15:32 1 -> / tmp / foo1
lrwx—— 1 rjc rjc 64 27 февраля, 15:32 2 -> / dev / pts / 5

Теперь запустите GDB:

 $ gdb -p 6760 / bin / cat
GNU gdb 6.4.90-debian

[лицензия удалена]

Присоединение к программе: / bin / cat, процесс 6760

[вырезать другие вещи, которые сейчас не интересны]

(gdb) p закрыть (1)
$ 1 = 0
(gdb) p creat ("/ tmp / foo3", 0600)
2 доллара = 1
(gdb) q
Программа запущена. Все равно выйти (и отсоединить)? (y или n) y
Отключение от программы: / bin / cat, процесс 6760

Команда p в GDB распечатает значение выражения, выражение может быть функцией для вызова, это может быть системный вызов ... Поэтому я выполняю close () и передаю дескриптор файла 1, затем я выполняю системный вызов creat () , чтобы открыть новый файл. Результатом creat () было 1, что означает, что он заменил предыдущий дескриптор файла. Если бы я хотел использовать один и тот же файл для stdout и stderr или если бы я хотел заменить дескриптор файла каким-либо другим номером, мне нужно было бы вызвать системный вызов dup2 () для достижения этого результата.

В этом примере я решил использовать creat () вместо open () , потому что здесь меньше параметров. Макросы C для флагов нельзя использовать из GDB (он не использует заголовки C), поэтому мне пришлось бы читать файлы заголовков, чтобы обнаружить это - это не так сложно сделать, но потребует больше времени. Обратите внимание, что 0600 - это восьмеричное разрешение для владельца, имеющего доступ для чтения / записи, а также для группы и других пользователей, не имеющих доступа. Также можно было бы использовать 0 для этого параметра и позже запустить chmod для файла.

После этого я проверяю результат:

 ls -l / proc / 6760 / fd /
всего 3
lrwx—— 1 rjc rjc 64 27.02.2008 15:32 0 -> / dev / pts / 5
l-wx—— 1 rjc rjc 64 27.02.2008 15:32 1 -> / tmp / foo3 <====
lrwx—— 1 rjc rjc 64 27.02.2008 15:32 2 -> / dev / pts / 5

При вводе дополнительных данных в cat файл / tmp / foo3 добавляется к.

Если вы хотите закрыть исходный сеанс, вам нужно закрыть все файлы обрабатывает его, откройте новое устройство, которое может быть управляющим tty, а затем вызовите setsid () .

123
ответ дан 23 November 2019 в 23:41
поделиться

Dupx

Dupx — это простая утилита *nix для перенаправления стандартного вывода/ввода/ошибки уже запущенного процесса.

Мотивация

Я часто оказывался в ситуации, когда процесс, который я запускал в удаленной системе через SSH, занимал гораздо больше времени, чем я ожидал. Мне нужно разорвать SSH-соединение, но если я это сделаю, процесс умрет, если попытается что-то написать в stdout/ошибка сломанного канала. Я хотел бы приостановить процесс с помощью ^Z, а затем выполнить a

bg %1 >/tmp/stdout 2>/tmp/stderr

К сожалению, это не сработает (в шеллах я знаю).

http://www.isi.edu/~yuri/dupx/

15
ответ дан 23 November 2019 в 23:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: