oaf-slay improvements
- From: Brian Cameron <Brian Cameron sun com>
- To: gnome-components-list gnome org
- Cc: brian cameron sun com, louise miller sun com
- Subject: oaf-slay improvements
- Date: Fri, 4 May 2001 14:02:36 +0100 (BST)
I have made a number of updates to oaf-slay to make it run more
efficiently.
1. It checks the user's processes and only kills the processes that
need killing. This makes oaf-slay run very quickly rather than
using pkill which is very slow...especially on multi-user
server machines.
2. Added the "-l" option to display the processes without killing
them and the "-s" to turn on a "silent" mode.
3. Made the script a little more robust, and added more documentation
in the comments.
Enjoy, and let me know if it is useful. Please cc: any response to
me personally since I am not on this mailing list.
Brian
#!/usr/bin/perl
#
# oaf-slay
#
# Kills OAF processes
#
# Return code of -1 (255) returned if usage error.
# Return code of 1 indicates oaf processes were running
# when script was run.
# Return code of 0 indicates no oaf processes were
# running when script was run.
#
use Getopt::Std;
$usage_error = 0;
# Handle input arguments
#
$rc = getopts('lsh');
# Usage errors
#
if ($rc != 1) {
$usage_error = 1;
}
if ($opt_l && $opt_s) {
$usage_error = 1;
}
# Print usage if necessary.
#
if ($usage_error == 1 || $opt_h) {
print "\n";
print "Usage : oaf-slay [-hls]\n";
print "\tKill OAF processes still running.\n";
print "\t -h Print this help message.\n";
print "\t -l List processes running, but do not kill them. Not valid with -s\n";
print "\t -s Silent. Kill processes quietly\n";
print "\n";
exit(-1);
}
# Build ps command.
#
$uname = (`/bin/uname`)[0];
chomp($uname);
if ($uname eq "SunOS") {
$username = `/usr/ucb/whoami`;
} else {
$username = `/usr/bin/whoami`;
}
chomp($username);
$ps_cmd = "/bin/ps -e -opid,user,args | /bin/grep ".$username;
# get OAF files
#
@path = split(':', $ENV{'PATH'});
foreach $dir (@path) {
if (-f "$dir/oafd") {
$ins_dir = `/usr/bin/dirname $dir`;
chomp $ins_dir;
$oaf_dir = $ins_dir . "/share/oaf";
last;
}
}
chdir($oaf_dir);
opendir(DIR, $oaf_dir) || die "\nCan not open directory $oaf_dir\n\t$!\n\n";
@oaf_files = readdir(DIR);
closedir DIR;
# Initialize variables
#
$process_exists = 0;
$first_time = 1;
# Loop until no more processes are found. This typically loops only once,
# but if an OAF process is launched while this script is running an OAF
# process can be left behind and be caught on the second loop, etc.
#
do {
# Initialize variables.
#
@files = @oaf_files;
@list_array = ();
@process_pids = ();
@file_process = ();
$index = 0;
# Get process list.
#
@ps_result = `$ps_cmd`;
# Loop through files, and see if any OAF processes are running. If
# so, then build the @list_array and @process_pids arrays.
# @list_array contains the process names
# @process_pids contains the process IDs
#
while ($fname = shift(@files)) {
if ("$fname" =~ /\.oaf$/) {
open(FILE, $fname);
while (<FILE>) {
$line = $_;
if ($line =~m/location[ \t]*\=/ &&
!($line =~m/type=\"shlib\"/)) {
$line =~s/.*location[ \t]*\="//;
$line =~s/".*//;
chomp($line);
$line =~s/\.\///;
# oafd needs to be last.
#
if ($line ne "oafd") {
push @file_process, $line;
}
} #end while(<FILE>)
}
close(FILE);
}
}
# Add oafd so that it is last.
#
push @file_process, "oafd";
foreach $filep (@file_process) {
if (not($filep =~m/^OAFIID:/)) {
# Search through @ps_result and look for matches
#
foreach $el (@ps_result) {
chomp $el;
if ($el =~m/$filep/ ) {
@ps_array = split(' ', $el);
$list_array[$index]=$ps_array[0]."\t".$ps_array[2]."\n";
$process_pids[$index]=$ps_array[0]."\n";
$index++;
}
}
}
}
# Do the killing.
#
if ($#list_array != -1) {
# Print output if -s (silent) argument is not specified.
#
if(!$opt_s) {
if ($first_time == 1) {
print "\n";
print "The following processes are still running on the system.\n";
if (!$opt_l) {
print "These processes will be terminated.\n";
print "\n";
print "NOTE: Killing these processes may affect other applications\n";
print "on the system that use OAF and bonobo.\n";
}
print "\n";
$first_time = 0;
} else {
# Just some feedback to indicate it had to loop...
#
print "...and...\n";
}
# Print list of processes...
#
print @list_array;
print "\n";
}
# Kill if the -l argument is specified.
#
if(!$opt_l) {
$killall = "/bin/kill";
$kill_params = ' -9 ';
foreach $proc (@process_pids) {
chomp $proc;
if($proc =~m/\d+/) {
$cmd = $killall.$kill_params.$proc." 2>/dev/null";
system($cmd);
}
}
}
$process_exists = 1;
}
# Only loop once if opt_l is used, otherwise loop until
# no more processes are killed
#
} while ($#list_array != -1 && !opt_l);
# Exit
#
if ($process_exists == 0) {
# Show feedback if -l argument is used
#
if ($opt_l) {
print "\n";
print "No processes.\n";
print "\n";
}
exit 1;
} else {
exit 0;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]