LINUX.ORG.RU
решено ФорумAdmin

перенаправление потока вывода программы запущенной в фоне

 ,


2

1

Например запускаю tcpdump, останавливаю его комбинацией клавиш Ctrl+z. Дальше если его перевести в фон командой bg, то вывод он будет направлять в консоль на которой был запущен.
Вопрос первый, как его теперь остановить с этой консоли, (если это конечно возможно)? Комбинация клавиш Ctrl+z не действует так как теперь tcpdump в фоне. Можно с другой консоли послать ему сигнал kill -20 pid и он опять уснёт. Ответ на этот вопрос нашёл. Надо прямо в этой консоли в которую идёт поток, не обращая внимания на него набирать вот такую комбинацию:

kill -20 `ps ax | grep tcpdump | grep -v grep | cut -c1-6`

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

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

★★

Ну ты извращенец. Просто открой второй терминал и смирись с тем, что несколько программ запущенных в одном шелле его совместно используют. tmux освой

anonymous ()

man fg на всякій случай

anonymous ()

вот такую комбинацию:
kill -20 `ps ax | grep tcpdump | grep -v grep | cut -c1-6`

Можно проще: kill -20 %tcpdump

Про fg анон правильно говорит. Перенаправить поток можно, но только через gdb.

anonymous ()
Ответ на: комментарий от anonymous

Спасибо последнему анониму, а вернее ссылке: 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

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

v4567 ★★ ()
Ответ на: комментарий от v4567

Почему сразу, при запуске tcpdump, нельзя перенаправить вывод?

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

anonymous ()

Что только люди не сделают, чтобы не читать маны...

tcpdump -i eth1 -s 1600 -vv -c 5000 > cap-log-`date +%s` 2>&1 &

berrywizard ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.