Форум системных администраторов

IT => Unix => Тема начата: v4567 от 31 августа 2016, 23:13:37

Название: перенаправление потока вывода программы запущенной в фоне
Отправлено: v4567 от 31 августа 2016, 23:13:37
Например запускаю 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 от 01 сентября 2016, 00:46:07
А что бы ему сразу не указать запись в файл (-w) ?
Название: перенаправление потока вывода программы запущенной в фоне
Отправлено: DedMagarbI4 от 01 сентября 2016, 14:23:17
tcpdump > 1.txt
Название: перенаправление потока вывода программы запущенной в фоне
Отправлено: v4567 от 01 сентября 2016, 14:32:21
Спасибо ссылке:
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_ от 13 сентября 2016, 00:14:43
А что бы ему сразу не указать запись в файл (-w) ?
v4567, сказали же. Но да, можно в гамаке и на лыжах. :D


Updated: 13 September 2016, 00:22:51

ЗЫ: А ещё получившийся дамп можно утащить к себе и спокойно его препарировать Вайршарком. ;)