[Comm] Убивание процесса со всеми его дочками

Dmitry Chistikov dd1email на gmail.com
Вт Янв 31 12:52:03 MSK 2012


Vladimir Karpinsky, Jan. 31, 2012, 12:00 +0400:
> Но! для 4.0 --- pkill (procps version 3.2.5):
> $ ps -eHo pid,pgid,cmd | grep 27319
> 27319 27319           /bin/bash /home/karp/bin/get_data
> 27340 27319             ping 5.86.210.67 -q -c5 -w10
> 
> $ pkill -g 27319
> pkill: No matching criteria specified
> Usage: pkill [-SIGNAL] [-fvx] [-n|-o] [-P PPIDLIST] [-g PGRPLIST] [-s SIDLIST]
>          [-u EUIDLIST] [-U UIDLIST] [-G GIDLIST] [-t TERMLIST] [PATTERN]

Насколько я вижу, это бага в procps.

Сравните:
3.2.5-alt7: http://git.altlinux.org/gears/p/procps.git?p=procps.git;a=blob;f=procps/pgrep.c;h=cf6ced95464864957fe98be998dad67149059ecb;hb=fe6442d4ad66cb30e095e743b94c448f7d5b2857#l538
3.2.8-alt1: http://git.altlinux.org/gears/p/procps.git?p=procps.git;a=blob;f=procps/pgrep.c;h=7ab63ea6d8c7b23e7a298b45cdab8d5dc1a5e6d5;hb=5268d4e01a739a6c48fe180d7c98b17172340d7a#l626
В старой версии -g не учитывается в подсчете критериев выбора,
в результате чего pkill полагает, что таковых не указано.

Согласно
http://git.altlinux.org/gears/p/procps.git?p=procps.git;a=history;f=procps/pgrep.c
и
http://git.altlinux.org/gears/p/procps.git?p=procps.git;a=commitdiff;h=76b8c1dcd63ad56be6a8dccf3f506fea44acd5ab ,
исправление появилось где-то между v3.2.5 и v3.2.7 (точнее, между
procps-3.2.6 и procps-3.2.7; см., например, "pgrep/pkill: g is criteria
(PLD Linux, patch found in locked filing cabinet)" в NEWS).

Если я правильно представляю Вашу задачу, то в качестве обхода можно
задать дополнительно что-нибудь вроде -U username.

Альтернатива: прикладываю патч, который должен решать эту проблему.

-- 
Дмитрий Чистиков
----------- следующая часть -----------
diff --git a/procps/pgrep.c b/procps/pgrep.c
index cf6ced9..2fe5986 100644
--- a/procps/pgrep.c
+++ b/procps/pgrep.c
@@ -538,8 +538,9 @@ parse_opts (int argc, char **argv)
 		case 'g':
 	  		opt_pgrp = split_list (optarg, conv_pgrp);
 			if (opt_pgrp == NULL)
 				usage (opt);
+			++criteria_count;
 			break;
 //		case 'i':
 //			opt_insensitive = 1;
 //			break;


Подробная информация о списке рассылки community