Автор Тема: перенаправление потока вывода программы запущенной в фоне  (Прочитано 652 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн v4567

  • Постоялец
  • ***
  • Сообщений: 105
  • Рейтинг: 0
  • Пол: Мужской
    • Просмотр профиля
  • Откуда: Харьков
Например запускаю tcpdump, останавливаю его комбинацией клавиш Ctrl+z. Дальше если его перевести в фон командой bg, то вывод он будет направлять в консоль на которой был запущен.
Вопрос первый, как его теперь остановить с этой консоли, (если это конечно возможно)? Комбинация клавиш Ctrl+z не действует так как теперь tcpdump в фоне. Можно с другой консоли послать ему сигнал kill -20 pid и он опять уснёт. Ответ на этот вопрос нашёл. Надо прямо в этой консоли в которую идёт поток, не обращая внимания на него набирать вот такую комбинацию:
kill -20 `ps ax | grep tcpdump | grep -v grep | cut -c1-6`

после нажатия enter-а процесс уснёт.

Остался не решённый второй вопрос. Как теперь, указать ему что бы он поток вывода направлял не в консоль с которой был запущен, а например в файл, (опять же если это возможно)?

Оффлайн Flyer_SPb

  • Модераторы
  • Старожил
  • *****
  • Сообщений: 962
  • Рейтинг: 24
  • Пол: Мужской
  • Ветеран войны с Kilrathi
    • Просмотр профиля
  • Откуда: 2:5030
А что бы ему сразу не указать запись в файл (-w) ?
They stole my gun, my beautiful Steltek gun!

Оффлайн DedMagarbI4

  • Ветеран
  • *****
  • Сообщений: 1713
  • Рейтинг: 11
  • Пол: Мужской
    • Просмотр профиля
  • Откуда: г.Невинномысск
tcpdump > 1.txt

Оффлайн v4567

  • Постоялец
  • ***
  • Сообщений: 105
  • Рейтинг: 0
  • Пол: Мужской
    • Просмотр профиля
  • Откуда: Харьков
Спасибо ссылке:
gdb


Резюмируя всё сказанное можно составить такой план действий.


Останавливаем процесс. Можно воспользоваться killall, можно kill -20 %название процесса. Я написал маленький скриптик:
#!/bin/bash

pid=`ps ax | grep "$1" | grep -v grep | cut -c1-6` &> /dev/null
pid=`echo $pid` &> /dev/null

kill -20 $pid

exit

Строка pid=`echo $pid` &> /dev/null для того что бы убрать пробелы перед номером pid если он 4-х, 3-х значный. По другому этот пробел у меня не получилось убрать.


Параметром этому скрипту передаём процесс который хотим остановить. Если процессов два или более, например:
tcpdump -i eth0 -n -nn
tcpdump -i eth1 -n -nn
то необходимо в параметре к скрипту передавать название самого процесса и его параметры, только всё это заключать в двойные кавычки, например:
скрипт "tcpdump -i eyh0 -n -nn"
После этого вывод на консоль уже не идёт, можно создать файлы куда в дальнейшем будем писать вывод, по команде ps узнать их pid-ы,
и далее выполнить такие команды для каждого процесса:
gdb -p pid процесса
gdb даёт свою командную строку в ней вводим:
p close(1)
p open("/путь/файл1", 1)
p close(2)
p open("/путь/файл2", 1)
q

далее подтверждаем "y"

Всё теперь вывод можно смотреть по команде tail:
tail -f /путь/файл1

Расписал всё подробно, может кому пригодится.


Оффлайн VaD_

  • Постоялец
  • ***
  • Сообщений: 250
  • Рейтинг: 10
    • Просмотр профиля
  • Откуда: Баян-Улгийский Аймаг
А что бы ему сразу не указать запись в файл (-w) ?
v4567, сказали же. Но да, можно в гамаке и на лыжах. :D


Updated: 13 September 2016, 00:22:51

ЗЫ: А ещё получившийся дамп можно утащить к себе и спокойно его препарировать Вайршарком. ;)
« Последнее редактирование: 13 Сентября 2016, 00:22:51 от VaD_ »
Иногда полезно не только говорить, что думаешь, но и думать, что говоришь.