всем привет,у меня есть сервер centos 5, сталкнулся с такой прблемой:
завис 1 тред в процессе апача, ушел в бесконечный цикл. нужно было убить его один, в процессе около 50 тредов было.
пытался сделать просто kill ID-треда, не убивает. пришлось убивать весь процесс.
Вопрос: как убить 1 тред из процесса, не убивая весь тред? я так понимаю kill это не умеет делать, есть какая нить утилита или како йсигнал послать треду? или его только родительский процесс может убить?ps. kill -9 не пробовал.
Действительно интересно.
tgkill() в ядре давно есть, т.е. послать сигнал конкретному треду можно, а вот что будет мъютексами и прочими ресурсами которые могут быть у этого треда загадка...
> Действительно интересно.
> tgkill() в ядре давно есть, т.е. послать сигнал конкретному треду можно, а
> вот что будет мъютексами и прочими ресурсами которые могут быть у
> этого треда загадка...да тож нашел этот сигнал, ток утилитки нету готовой для таких целей..
> Действительно интересно.
> tgkill() в ядре давно есть,А ещё есть pthread_kill() и чё?!
> А ещё есть pthread_kill() и чё?!Разжевать разницу между pthread_self()и gettid() или начнешь сам маны читать?
>> А ещё есть pthread_kill() и чё?!
> Разжевать разницу между pthread_self()и gettid() или начнешь сам маны читать?Не, лучше между pthread_timedjoin_np() и gettimeofday(), смысл одинаковый получится.
Ну а для начала научи как из баша иль через свою утиль, получить THREAD ID
скажем у всех тредов firefox_а иль тандырбёрда---
Так же для разминки мозга. Можешь открыть файл, который сейчас открыт в OpenOffice,
и именно с той позиции SEEK_CUR, на которой сейчас находиться в Open Office?---
Далее. Могёшь перехватить открытый сокет в режиме дуплексирования на уровне приложений?
Перехват пакетов и promisc режимы сетевухи запрещён администратором.
-----
Волшебные хаки по перехвату SYSCALL ядра естественно никто не разрешит делать.
> Ну а для начала научи как из баша иль через свою утиль,
> получить THREAD ID
> скажем у всех тредов firefox_а иль тандырбёрдаУУУ как все запущенно то...
man clone в районе CLONE_THREAD затем man ps про ключики -e,L и f
>> Ну а для начала научи как из баша иль через свою утиль,
>> получить THREAD ID скажем у всех тредов firefox_а иль тандырбёрда
> УУУ как все запущенно то...
> man clone в районе CLONE_THREAD
> затем man ps про ключики -e,L и f# ps -eLf | grep firefox
pavel 15705 3273 15705 0 1 22:01 ? 00:00:00 /bin/sh /usr/bin/firefox http://www.opennet.me/openforum/vsluhforumID9/9265.html#
pavel 15714 15705 15714 15 25 22:01 ? 00:00:18 /usr/lib64/firefox/firefox-bin http://www.opennet.me/openforum/vsluhforumID9/9265
pavel 15714 15705 15716 0 25 22:01 ? 00:00:00 /usr/lib64/firefox/firefox-bin http://www.opennet.me/openforum/vsluhforumID9/9265
pavel 15714 15705 15717 0 25 22:01 ? 00:00:00 /usr/lib64/firefox/firefox-bin http://www.opennet.me/openforum/vsluhforumID9/9265
pavel 15714 15705 15718 0 25 22:01 ? 00:00:00 /usr/lib64/firefox/firefox-bin http://www.opennet.me/openforum/vsluhforumID9/9265
pavel 15714 15705 15719 0 25 22:01 ? 00:00:00 /usr/lib64/firefox/firefox-bin http://www.opennet.me/openforum/vsluhforumID9/9265
pavel 15714 15705 15720 0 25 22:01 ? 00:00:00 /usr/lib64/firefox/firefox-bin http://www.opennet.me/openforum/vsluhforumID9/9265
pavel 15714 15705 15721 0 25 22:01 ? 00:00:00 /usr/lib64/firefox/firefox-bin http://www.opennet.me/openforum/vsluhforumID9/9265
pavel 15714 15705 15722 0 25 22:01 ? 00:00:00 /usr/lib64/firefox/firefox-bin http://www.opennet.me/openforum/vsluhforumID9/9265
pavel 15714 15705 15737 0 25 22:01 ? 00:00:00 /usr/lib64/firefox/firefox-bin http://www.opennet.me/openforum/vsluhforumID9/9265
pavel 15714 15705 15739 0 25 22:01 ? 00:00:00 /usr/lib64/firefox/firefox-bin http://www.opennet.me/openforum/vsluhforumID9/9265
pavel 15714 15705 15740 0 25 22:01 ? 00:00:00 /usr/lib64/firefox/firefox-bin http://www.opennet.me/openforum/vsluhforumID9/9265
pavel 15714 15705 15741 0 25 22:01 ? 00:00:00 /usr/lib64/firefox/firefox-bin http://www.opennet.me/openforum/vsluhforumID9/9265
pavel 15714 15705 15742 0 25 22:01 ? 00:00:00 /usr/lib64/firefox/firefox-bin http://www.opennet.me/openforum/vsluhforumID9/9265
pavel 15714 15705 15743 0 25 22:01 ? 00:00:00 /usr/lib64/firefox/firefox-bin http://www.opennet.me/openforum/vsluhforumID9/9265
pavel 15714 15705 15749 0 25 22:01 ? 00:00:00 /usr/lib64/firefox/firefox-bin http://www.opennet.me/openforum/vsluhforumID9/9265
pavel 15714 15705 15751 0 25 22:01 ? 00:00:00 /usr/lib64/firefox/firefox-bin http://www.opennet.me/openforum/vsluhforumID9/9265
pavel 15714 15705 15755 0 25 22:01 ? 00:00:00 /usr/lib64/firefox/firefox-bin http://www.opennet.me/openforum/vsluhforumID9/9265
pavel 15714 15705 15756 0 25 22:01 ? 00:00:00 /usr/lib64/firefox/firefox-bin http://www.opennet.me/openforum/vsluhforumID9/9265
pavel 15714 15705 15757 0 25 22:01 ? 00:00:00 /usr/lib64/firefox/firefox-bin http://www.opennet.me/openforum/vsluhforumID9/9265
pavel 15714 15705 15758 0 25 22:01 ? 00:00:00 /usr/lib64/firefox/firefox-bin http://www.opennet.me/openforum/vsluhforumID9/9265
pavel 15714 15705 15762 0 25 22:01 ? 00:00:00 /usr/lib64/firefox/firefox-bin http://www.opennet.me/openforum/vsluhforumID9/9265
pavel 15714 15705 15763 0 25 22:01 ? 00:00:00 /usr/lib64/firefox/firefox-bin http://www.opennet.me/openforum/vsluhforumID9/9265
pavel 15714 15705 15765 0 25 22:01 ? 00:00:00 /usr/lib64/firefox/firefox-bin http://www.opennet.me/openforum/vsluhforumID9/9265
pavel 15714 15705 15768 0 25 22:01 ? 00:00:00 /usr/lib64/firefox/firefox-bin http://www.opennet.me/openforum/vsluhforumID9/9265
pavel 15714 15705 15777 0 25 22:01 ? 00:00:00 /usr/lib64/firefox/firefox-bin http://www.opennet.me/openforum/vsluhforumID9/9265
pavel 16737 1 16737 0 1 22:01 ?# kill 15758
# ps -eLf | grep firefoxКуй!
---
Учим различия PID/GID/PPID/EID/TID, и без дела непи...дим.
Повтор:Как из баша иль через свою утиль, получить THREAD ID скажем
у всех тредов firefox_а иль тандырбёрда
> Ну а для начала научи как из баша иль через свою утиль,
> получить THREAD ID скажем у всех тредов firefox_а иль тандырбёрдаВ смысле зачитать тебе вслух ман ps?
Ну или давай шелл, помогу набрать ps -eLf и покажу колонку LWP
>> Ну а для начала научи как из баша иль через свою утиль,
>> получить THREAD ID скажем у всех тредов firefox_а иль тандырбёрда
> В смысле зачитать тебе вслух ман ps?
> Ну или давай шелл, помогу набрать ps -eLf и покажу колонку LWPТы идиот? Ты в глаза THREAD ID видел?
На, дрочи до посинения;
#include <stdio.h>
#include <pthread.h>int main() {
return printf("%zd\n", pthread_self());
}Флажочег -pthread для ГЦЦ низабуть, а то мало ли чё, вдруг вчера только Юних увидел.
> Ты идиот? Ты в глаза THREAD ID видел?Можно я по еврейски отвечу? спасибо
Ты идиот? Разницу между TID в ядре и pthread_t понимаешь?
>> Ты идиот? Ты в глаза THREAD ID видел?
> Можно я по еврейски отвечу? спасибо
> Ты идиот? Разницу между TID в ядре и pthread_t понимаешь?Ну дибил, убей тогда один, на выбор, тред фаерокса.
И задолбали уже своим "знанием манов",
вопрос был - Как убить тред из вне.
Ответ - никак!Всё нах..., закрыли тему. pgkill/pthread - засуньте себе в анус.
> Учим различия PID/GID/PPID/EID/TID, и без дела непи...дим.Бинго!
Вылазим из танка, рисуем утиль делающий tgkill(PID, TID[да да тот самый LWP из ps], SIG);
и наслаждаемся. Правда скорее всего наслаждаться будем упавшим ff, ну да потому такой утилиты и нет.PS: спасибо, как обычно повеселил.
> PS: спасибо, как обычно повеселил.Не, веселят меня бакланы читающие маны.
>> А ещё есть pthread_kill() и чё?!
> Разжевать разницу между pthread_self()и gettid() или начнешь сам маны читать?нет, ну это было более-менее адекватное сообщение, делая скидку автору, это же Павлинукс. Потом он, как обычно, сел в лужу в нескольких темах сразу,но это не так важно, в принципе.
Абстрагируясь от автора, мы можем предположить, что данным конкретным сообщением автор пытается выразить сомнение в возможности доставки сигналов конкретным потокам извне, и это сомнение вполне резонно. Некоторое время назад в линукс потоки имели различные пиды и имели дополнительный процесс "менеджер потоков", раньше - до nptl-реализации, и вот тогда можно было посылать сигналы отдельным потокам, и даже этому "процессу-менеджеру",ну а сейчас - нет.
> Абстрагируясь от автора, мы можем предположить, что данным конкретным сообщением автор
> пытается выразить сомнение в возможности доставки сигналов конкретным потокам извне, и
> это сомнение вполне резонно. Некоторое время назад в линукс потоки имели
> различные пиды и имели дополнительный процесс "менеджер потоков", раньше - до
> nptl-реализации, и вот тогда можно было посылать сигналы отдельным потокам, и
> даже этому "процессу-менеджеру",ну а сейчас - нет.Вов, Вы то не павлин, проверьте сами tgkill() работает ровно так, как обещает ман.
ntpl как раз использует clone c CLONE_THREAD т.е. триды самые, что ни наесть ядерные. А вот с _не_ ntpl, т.е. с любой реализацией нитей в юзерспейсе оно действительно не работает, ну да ведь этого никто и не обещал.На самом деле в случаях когда, мы заранее уверенны, что наши нити написаны, таким образом, что по сигналу не тупо сдохнут, а отпустят все свои ресурсы, то из tgkill() получится вполне юзабельная вещь. Которую можно воткнуть в *ctl утилиту идущую в комплект к демону.
>> Абстрагируясь от автора, мы можем предположить, что данным конкретным сообщением автор
>> пытается выразить сомнение в возможности доставки сигналов конкретным потокам извне, и
>> это сомнение вполне резонно. Некоторое время назад в линукс потоки имели
>> различные пиды и имели дополнительный процесс "менеджер потоков", раньше - до
>> nptl-реализации, и вот тогда можно было посылать сигналы отдельным потокам, и
>> даже этому "процессу-менеджеру",ну а сейчас - нет.
> tgkill() работает ровно так, как обещает ман.Да, действительно, так и есть - линукс можно точно указывать поток, который должен получить сигнал. Если быть дотошным, то ман обещает несколько более удобный интерфейс, но это уже мелочи. Ман в моей системы пишет про поддержку -1 в качестве пида/номера группы потоков, в ядре же жесткий возврат EINVAL на значение pid <= 0, в kernel/signal.c. Пришлось использовать syscall(SYS_tgkill, pid, tid, signum), но это детали, главное то, что реально можно указывать конкретный поток из ps -aLF.
> всем привет,
> у меня есть сервер centos 5, сталкнулся с такой прблемой:
> завис 1 тред в процессе апача, ушел в бесконечный цикл. нужно было
> убить его один, в процессе около 50 тредов было.
> пытался сделать просто kill ID-треда, не убивает. пришлось убивать весь процесс.
> Вопрос: как убить 1 тред из процесса, не убивая весь тред? я
> так понимаю kill это не умеет делать, есть какая нить утилита
> или како йсигнал послать треду? или его только родительский процесс может
> убить?
> ps. kill -9 не пробовал.мда kill -9 на тред убивает весь процесс ((
> всем привет,
> у меня есть сервер centos 5, сталкнулся с такой прблемой:
> завис 1 тред в процессе апача, ушел в бесконечный цикл. нужно было
> убить его один, в процессе около 50 тредов было.
> пытался сделать просто kill ID-треда,А как ты узнал thread ID у внешнего процесса ??? :)
> А как ты узнал thread ID у внешнего процесса ??? :)pstree показывает PID и его треды:
# pstree -p 22079
httpd.worker(22079)-+-{httpd.worker}(22081)
|-{httpd.worker}(22082)
|-{httpd.worker}(22083)
|-{httpd.worker}(22084)
|-{httpd.worker}(22085)
`-{httpd.worker}(22086)через ps также можно вытащить их.
Господа, получается нет возможности убить 1 тред из процесса стандартными юникс утилитами? остается только писать скрипт на С/С++ с вызовом соответсвующего сигнала ?
>[оверквотинг удален]
> |-{httpd.worker}(22083)
>
> |-{httpd.worker}(22084)
>
> |-{httpd.worker}(22085)
>
> `-{httpd.worker}(22086)
> через ps также можно вытащить их.
> Господа, получается нет возможности убить 1 тред из процесса стандартными юникс утилитами?
> остается только писать скрипт на С/С++ с вызовом соответсвующего сигнала ?Да. По идее в пакете procps должно быть что-то вроде tgkill, довольно простая утилита.