LINUX.ORG.RU

trap в цикле

 , ,


0

3

Есть скрипт для запуска tcpdump на многих хостах
Условно говоря

for host in hostlist
do
ssh $host tcpdump1 > dumpfile1&
ssh $host tcpdump2 > dumpfile2& done
Как надо обернуть этот цикл в trap, чтобы по нажатию Ctrl+c пройтись по списку хостов и поубивать все экземпляры tcpdump
for host in hostlist;ssh $host pkill -9 tcpdump
?

★★★★★

По идее по с-с должны убиться все локальные ssh, соответственно разорвутся их соединения, и у удаленных tcpdump'ов порвется stdout (не говоря уже о сессии), на чем они и завершатся. Сейчас не так?

Могу тупить, конечно...

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

Они все в фоне, поэтому Ctrl+c до них не долетает

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

Мм, надо пиды тогда собирать от ssh и их локально прибивать (удаленные процессы сами повалятся вслед за сессией). Не знаю как, сорри, жди башистов.

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

Что прибивать - непринципиально, меня интересует синтаксис для цикла
Вот как я делал до того как эта задача расползлась на много хостов

trap 'ssh ${host} pkill tcpdump;exit' INT
ssh ${host} "tcpdump -i ${interface1}" > ${dump1} &\
ssh ${host} "tcpdump -i ${interface2}" > ${dump2}
trap - INT

zolden ★★★★★ ()
Последнее исправление: zolden (всего исправлений: 1)

напиши функцию с указанным циклом и эту функцию отдай трапу

sdio ★★★★★ ()
ssh $host tcpdump1 > dumpfile1&
echo $! >> $PIDLIST
sin_a ★★★★★ ()

в догонку, вместо таких скриптов лучше использовать dsh

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

иии? я наверно не очень внятно объяснил в чём у меня затык - затык в том, что я не понимаю где трап ловить
я пробовал и цикл оборачивать, и после цикла - не срабатывает
так что список пидов мне только на лоб клеить, толку от него нет

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

Ну после CtrlC можно будет их все убить. Можно поставить какой нибудь read, если нужно дать пользователю определять время работы.

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

Я уже отвечал выше, что это совершенно непринципиально, что делать по Ctrl+c - будь то отстрел локальных ssh или удалённых tcpdump.
Моя проблема в том что я не могу сам INT поймать и обработать, т.е. очевидно я не так или не там ловлю.
Я пробовал вставлять после самого цикла

trap 'for host in hostlist;ssh $host pkill -9 tcpdump;exit' INT
trap - INT
но все копии tcpdump выжили

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

Честно говоря я не очень понял твой код, но не понимаю что мешает в известный момент времени поубивать процессы с известными PIDами.

sin_a ★★★★★ ()

Я для подобных задач использую fabric + screen: Запускаю таску с помощью, например

screen -S my_tcpdump_task -X detach -t -m tcpdump -n -s0 ...
а потом, когда надо, останавливаю:
screen -S my_tcpdump_task -X quit
Ну и fabric умеет это делать параллельно, а не в цикле, что тоже может быть полюсом.

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

Прошу прощения, был напуган и неверно написал команду. Запускать надо так:

screen -S my_tcpdump_task -d -m tcpdump -n -s0 ...

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

trap - INT скидывает хандлер, может убрать эту строку? Вот такое у меня заработало:

PIDS="PIDS"
trap 'echo kill -s INT `cat $PIDS`; rm -f $PIDS; exit' INT

rm -f $PIDS

sh -c 'sleep 60' &
echo $! >> $PIDS

sh -c 'sleep 60' &
echo $! >> $PIDS

sh -c 'sleep 60' &
echo $! >> $PIDS

read

arturpub ★★ ()

Не такое поведение имеется в виду?

#!/bin/bash
trap 'kill $(jobs -p)' INT
for host in hostlist; do
  ssh $host tcpdump1 > dumpfile1 &
  ssh $host tcpdump2 > dumpfile2 &
done
wait

unterwulf ()

ps -C ssh -o pid=, кажется

for pid in $(ps -C ssh -o pid=); do
  kill $pid
done

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

Спасибо, друг, классный скрипт.
Откуда, куда и для чего он?

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

В этом случае у вас скрипт «висел» на

ssh ${host} "tcpdump -i ${interface2}" > ${dump2}
и команда
trap - INT
не выполнялась до нажатия Ctrl-C.

В том, что привдено в стартовом скрипте вобще не понятно, как скрипт может поймать Ctrl-C, там ведь просто запускается всё в фоне и конец цикла/скрипта?

Вобще не понятно, зачем вам:

trap - INT
защита от множественного нажатия Ctrl-C, что-ли?

mky ★★★★★ ()

Прочитал как «трап в цирке». Ужаснулся.

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