pskill 用于通过关键字杀死当前系统正则运行的进程, 基于linux命令 ps, grep , kill 实现. 主要特性:
支持通过关键字筛选进程列表, 进程列表自带序号筛选时支持使用多个关键字, 多个关键字直之间时或的关系支持通过列表序号杀死进程, 而非进程id,使用更方便支持批量杀死多个进程支持快速杀死全部进程.
1. 用法示例
pskill 会查询出所有包含关键字的进程, 然后并为每个进程赋予序号用户输入要杀死的进程序号,可支持多个,或全部
1.1 单个关键字, 选择杀死多个进程
$ pskill redis
[1 ] zongf 4435 1311 0 5月11 ? 00:49:00 redis-server 127.0.0.1:6481
[2 ] zongf 4451 1311 0 5月11 ? 01:03:21 redis-sentinel 127.0.0.1:26481 [sentinel]
[3 ] zongf 4456 1311 0 5月11 ? 01:01:07 redis-sentinel 127.0.0.1:26482 [sentinel]
[输入] 请输入您要杀死的进程序号,0表示所有: 2 3
[成功] 进程pid: 4451 强制杀死成功!
[成功] 进程pid: 4456 强制杀死成功!
1.2 多个关键字,选择杀死全部进程
$ pskill 7481 7482
[1] zongf 29081 1311 0 13:26 ? 00:00:00 redis-server 127.0.0.1:7481 [cluster]
[2] zongf 29086 1311 0 13:26 ? 00:00:00 redis-server 127.0.0.1:7482 [cluster]
[3] zongf 29208 25920 0 13:27 pts/3 00:00:00 /usr/bin/perl /home/zongf/soft/zongf/tools/pskill 7481 7482
[输入] 请输入您要杀死的进程序号,0表示所有: 0
[成功] 进程pid: 29081 强制杀死成功!
[成功] 进程pid: 29086 强制杀死成功!
2. 命令源码
use warnings
;
use Term
::ANSIColor
qw(:constants);
$Term::ANSIColor::AUTORESET = 1;
sub check_help{
my $param = $ARGV[0];
if("-h" eq $param || "--help" eq $param){
print BOLD BLUE
"Desc: "; print "强制杀死正在运行的进程,可同时杀死多个进程\n";
print BOLD BLUE
"Args: "; print "多个进程启动关键字,支持模糊查询\n";
print BOLD BLUE
"Exam: "; print "kill9 tomcat redis\n";
print BOLD BLUE
"Auth: "; print "zonggf\n";
print BOLD BLUE
"Date: "; print "2016-12-22\n";
exit
;
}
}
sub print_color(){
if(@_ < 2){
print shift
@_;
return
;
}
my $line = shift
@_;
my @patterns = @_;
my $spectors = (shift
@_) . '+';
foreach(@_){
$spectors .= "|$_+";
}
my @arrays = split
(/($spectors)/, $line);
for my $item(@arrays){
my $pattern = "@patterns";
my $idx = index
($pattern, $item);
if($idx > -1){
print BOLD RED
$item;
}else{
print $item;
}
}
}
sub fmt_idx{
return shift
@_ if @_ < 2;
my ($str, $array_length) = @_;
my $length = length
$array_length;
return sprintf
"[%-${length}s] ", $str;
}
sub kill_ps_line{
my $ps_line = shift
@_;
my $pid = (split
/\s+/,$ps_line)[1];
$cnt = kill
9, $pid;
if($cnt == 1){
printf
"[成功] 进程pid: m 强制杀死成功!\n",$pid;
} else {
printf "
[失败
] 进程pid
:%6d 强制杀死成功
!\n"
,$pid;
}
}
sub get_user_choose{
#
print "
\n
[警告
] 您正在试图强制杀死以上
$length 个进程
,确认请输入 y
: "
;
print "
\n
[输入
] 请输入您要杀死的进程序号,
0表示所有
: "
;
chomp
($choose=<STDIN>);
#判断用户输入是否只能是数字
unless($choose =~ /^(\s|[0-9]|\s)+$/){
print "[错误] 只能输入正整数\n";
exit
;
}
@ids = split
(/\s+/, $choose);
@ids_asc = sort
@ids;
if(@ids_asc >1 && $ids_asc[0] ==0 ){
print "[错误] 0 表示全部, 只能单独使用\n";
exit
;
}
if($ids_asc[-1] > (@lines +1) || $ids_asc[0] < 0){
print "[错误] 序号取值范围为 [0~ " . (@lines) . "]\n";
exit
;
}
if(@ids == 1 && $ids_asc[0] ==0){
return
(1 .. @lines);
}else{
return
@ids;
}
}
&check_help;
if(@ARGV <1){
print "此命令需要至少一个参数作为筛选条件!\n";
exit
;
}
@patterns = @ARGV;
$names = shift
@ARGV;
foreach (@ARGV){
$names .="|$_";
}
$ps_cmd = 'ps -ef | grep -v grep | grep -v pskill';
$ps_cmd .= " | grep -E \"" . $names ."\"" if defined
$names;
@lines = `$ps_cmd`;
$length =@lines;
if($length < 1){
print "没有符合条件的进程运行\n";
exit
;
} else{
$lines_length = @lines;
for $idx (1 ... @lines){
print BOLD GREEN
&fmt_idx($idx, $lines_length);
&print_color($lines[$idx-1], @patterns);
}
@ids = &get_user_choose;
&kill_ps_line($lines[$_-1]) foreach @ids;
}