今回は、psコマンドなどでPIDを調べてkillするのが面倒な場合などに便利なスクリプトを紹介しようと思う。
例えば、killしたいプロセスの名前がある程度分かっている場合などで便利だ。
まずは、実行結果を簡単に説明していこう。
基本的には、
検索→マッチしたプロセスを全て消すか選択して消すか→繰り返し・・・→終了
といったように、対話的に実行していく。
$ ./process_search_kill.pl Argv error. $ ./process_search_kill.pl irc PID Deny(*) (PROCESS INFO) ========================= 3756 * (root 3756 0.0 0.4 .* ircd -c) 6870 * (root 6870 0.0 0.9 .* ./irc_write_httpd.pl) 8111 (500 8111 0.0 0.9 .* ./irc_write_message.pl) 8112 (500 8112 0.0 0.9 .* ./irc_write_secure.pl) 8942 * (root 8942 0.0 0.9 .* ./irc_write_httpd.pl) 8943 * (root 8943 0.0 0.9 .* ./irc_write_httpd.pl) ========================= ( * :Permission deny or killing now) PID is accessible: 8111 8112 PID is not accessible: 3756 6870 8942 8943 kill above all/select process except * ?[all/select/finish]:select Select[finish/PID is alive]. [8111 8112 finish]:8111 kill 8111 PID Deny(*) (PROCESS INFO) ========================= 3756 * (root 3756 0.0 0.4 .* ircd -c) 6870 * (root 6870 0.0 0.9 .* ./irc_write_httpd.pl) 8112 (500 8112 0.0 0.9 .* ./irc_write_secure.pl) 8942 * (root 8942 0.0 0.9 .* ./irc_write_httpd.pl) 8943 * (root 8943 0.0 0.9 .* ./irc_write_httpd.pl) ========================= ( * :Permission deny or killing now) PID is accessible: 8112 PID is not accessible: 3756 6870 8942 8943 Select[finish/PID is alive]. [8112 finish]:finish $
このように、第一引数に検索文字列を指定し、実行すると、文字列に一致するプロセス一覧が表示される。
そして、実行したユーザーがアクセス不可なプロセスには「*」が付けられる。
これで、「all」によって、アクセス可能なプロセスを全てkillするか、「select」によってプロセスを選択しながらkillしていくことができる。
最後は「finish」で終了する。
結構単純なスクリプトだが、意外と便利だ。
以下にソースを示す。
#!/usr/bin/perl use strict; #use warnings; my @pid; my ($input, $line); if($#ARGV != 0) { die("Argv error.\n"); } my $MATCH_PATTERN = $ARGV[0]; my $NO_MATCH_PATTERN = "process_search_kill.pl"; @pid = &process_chk($MATCH_PATTERN, $NO_MATCH_PATTERN); while(1) { print "kill above all/select process except * ?[all/select/finish]:"; $input = <STDIN>; chomp($input); if($input eq "all") { print "kill @pid\n"; kill 0 => @pid; exit; } elsif($input eq "select") { while(1) { print "Select[finish/PID is alive].\n[@pid finish]:"; $input = <STDIN>; chomp($input); if($input eq "finish") { exit; } else { foreach $line (@pid) { if($input eq $line) { kill(1,$input); print "kill $input\n" } } @pid = &process_chk($MATCH_PATTERN, $NO_MATCH_PATTERN); } } } elsif($input eq "finish") { exit; } else { print "input error.\n"; } } sub process_chk { local(*MATCH_PATTERN, *NO_MATCH_PATTERN) = $_; my (@match_line, @pid, @pid_error); my $line; my @all_process = `ps aux`; my $i = 0; my $j = 0; print "\n"; print "PID\tDeny(*)\t(PROCESS INFO)\n"; print "=========================\n"; foreach $line (@all_process) { if(($line =~ /$MATCH_PATTERN/) and ($line !~ /$NO_MATCH_PATTERN/)) { @match_line = split(/ +/, $line); $pid[$i] = $match_line[1]; chomp($line); if(kill 0 => $pid[$i]) { print "$pid[$i]\t\t($line)\n"; $i++; } else { print "$pid[$i]\t*\t($line)\n"; $pid_error[$j] = $pid[$i]; pop(@pid); $j++; } } } print "=========================\n"; print "( * :Permission deny or killing now)\n"; print "\n"; print "PID is accessible:\t@pid\n"; print "PID is not accessible:\t@pid_error\n\n"; if(@pid) { return @pid; } else { print "No PID is accessible.\n"; exit; } }