LINUX.ORG.RU

Помогите убить потомков

 ,


0

2

Всем привет, запускаю потомка вот так

coproc PPP { while true; do nc -l -p 1234 -e script.sh; done; }

а потом завершаю его

kill -13 $PPP_PID

в результате сам потомок завершается, но процесс

nc -l -p 1234 -e script.sh

остается жив и занимает порт, помогите корректно завершить все процессы

Ответ на: комментарий от zloikakpes

Да, я обновил ответ. Два дефиса нужно поставить перед этим аргументом, чтобы он не трактовался как параметр.

intelfx ★★★★★ ()
Ответ на: комментарий от intelfx
$ ps al
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
0  1000  1180  3429  20   0 116644  4600 wait   Ss   pts/1      0:00 bash
0  1000  4932     1  20   0  47780  3428 poll_s S    pts/1      0:00 nc -l -p 1234 -e script.sh
0  1000  4951  1180  20   0 121264  2192 -      R+   pts/1      0:00 ps al

процесс все еще жив

zloikakpes ()

It's a trap!

man trap
Поисковый запрос «/^[ ]*trap»
Если б я родил ребёнка и не был бы проинструктирован убить ребёнка перед своей смертью, то после моей смерти мой ребёнок выжил бы.

Northsoft ★★ ()
Последнее исправление: Northsoft (всего исправлений: 2)
Ответ на: It's a trap! от Northsoft

Можно чуть по подробнее? Такая конструкци не работает

coproc PPP { trap 'kill -PIPE $!; exit;' PIPE; while true; do nc -l -p 1234 -e script.sh; done; }

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

trap '…' SIGPIPE?

См. trap -l | grep -i pipe
И да, зойчем ви таки делаете пiдстановку $! в одинарных кавычках? Ведь «Enclosing characters in single quotes (‘'’) preserves the literal value of each character within the quotes». Юзайте двойные кавычки и буде вам щястье.

Northsoft ★★ ()
Последнее исправление: Northsoft (всего исправлений: 1)
Ответ на: комментарий от AlexDi

И да, оп, ваша траблема может быть решена целой кучей всяких разных способов. Например, родить ребёнка и зафиксировать полученный $! в файле child.pid, потом убить ребёнка, зная его pid. Или почитать man netstat, особливо про аргумент «-p», и дальше уже вести прицельный огонь по своим детям.

Northsoft ★★ ()

Да, название так и тянет на блокировку =)
[humor]
Нужно вызвать, Бендера! Он давно мечтает «Убить всех человеков»!
[/humor]

Atlant ★★★★★ ()
Последнее исправление: Atlant (всего исправлений: 1)
Ответ на: поди врёшь ты всё от zolden

без проблем, вот листинг

alex@debian:~$ ps al
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
0  1000 20319 20307  20   0  23880  4308 -      Ss   pts/2      0:00 bash
0  1000 25858 20319  20   0  10668  1120 -      R+   pts/2      0:00 ps al
alex@debian:~$ coproc PPP { trap "kill $!; exit;" SIGPIPE; while true; do nc -l -p 1234; done; }
[1] 26540
alex@debian:~$ ps al
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
0  1000 20319 20307  20   0  23880  4308 -      Ss   pts/2      0:00 bash
1  1000 26540 20319  20   0  23880  2928 -      S    pts/2      0:00 bash
0  1000 26541 26540  20   0   6308   716 -      S    pts/2      0:00 nc -l -p 1234
0  1000 26675 20319  20   0  10668  1120 -      R+   pts/2      0:00 ps al
alex@debian:~$ kill $PPP_PID
alex@debian:~$ ps al
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
0  1000 20319 20307  20   0  23880  4308 -      Ss   pts/2      0:00 bash
0  1000 26541     1  20   0   6308   716 -      S    pts/2      0:00 nc -l -p 1234
0  1000 26899 20319  20   0  10668  1116 -      R+   pts/2      0:00 ps al
[1]+  Terminated              coproc PPP { trap "kill $!; exit;" SIGPIPE; while true; do
    nc -l -p 1234;
done; }

как видно в конце остается процесс netcata с ppid равным 1

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

Kill не хочет убивать потомков. Бывает, pstree - p $PPP_PID в помощь.

Например в команде:

pstree -p $PPP_PID| perl -ne 'print "$1\n" while /\((\d+)\)/g;'
замени print на `kill -9 $1`

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

для того чтобы trap отработал нужен программный тик, иными словами должен завершиться nc, а он не завершится пока он не сделает свои грязные делишки ))) В принципе можно заменить nc на sleep или read, будет тоже самое. Может это ограничение можно обойти?

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

OMG, великий золден, ты прав, так оно работает и убивает всех не щадя (даже trap не нужен), спасибо за решение!

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

Не подскажешь как эту команду в скрипте написать, так не поставлю дефис все ругается

server.sh: line 20: kill: (-13405) - No such process
AlexDi ()
Ответ на: комментарий от zolden

Да, действиельно в bash есть встроенная команда kill которая не совсем тот kill который лежит по адресу /bin/kill, в очередной раз благодарю за подсказку.

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

А если я не беру кредиты — это значит, что я не возвращаю долги?

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