Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses

Comment on

( #3333=superdoc: print w/ replies, xml ) Need Help??
#!/usr/bin/perl -w # # # Interactive process killer utilizing the Tk GUI toolkit. # Uses the system's "ps" command to get a list of the currently-runnin +g processes, # and the system's "kill" command to send them signals. # # My machine's "ps", when run with "ps ux", gives output like the foll +owing: # USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMA +ND # falkkin 531 0.0 1.4 2316 1380 tty1 S 08:53 0:00 -bash # # My machine's "kill" is of the form "kill -s $signal $pid". # Supported signals include TERM, STOP, CONT, INT, HUP, and KILL. # # You'll need to modify this script if your "ps" command formats outpu +t differently # or your "kill" command has different syntax. # Eventually, I hope to make this script more portable. # # Authored by Colin McMillen (e-mail: colin at and +released # into the public domain. You may use, copy, redistribute, and modify +this program # without any restrictions. # # use strict; use Tk; my $VERSION = v0.1; # Choose the options to send to "ps". Defaults to "ps ux". my $PS_OPTIONS = $ARGV[0] || "ux"; # Index (starting from 0) of the fields for process ID and command nam +e. my $PID_FIELD = 1; my $COMMAND_FIELD = 10; # Create the main window and add an informational label. my $top = MainWindow->new(); $top->title(""); $top->Label(text => "Double-click on the process you would like to kil +l.")->pack(); # Create a frame to hold the process list and its scrollbar. my $frame1 = $top->Frame()->pack(fill => "both", expand => "y"); # Get the actual process list and discard the first line of output (wh +ich # contains informational headers that we want to ignore). my @processes = `ps $PS_OPTIONS`; shift @processes; # Use the process list to create a listbox. Add the listbox to $frame1 +. my $process_list = $frame1->Listbox(width => 80, height => 15)->pack(side => "left" +, fill => "both" +, expand => "y") +; # Split each line of output into fields, based on whitespace. Then, ge +t the # process ID and command name out of the fields, and add them to the l +istbox. foreach my $process (@processes) { my (@fields) = split(/\s+/, $process); my $pid = $fields[$PID_FIELD]; my @command = @fields[ $COMMAND_FIELD .. @fields-1 ]; my $command = join(" ", @command); $process_list->insert("end","$pid $command"); } # Bind a double-click on the listbox to the kill() subroutine. $process_list->bind("<Double-1>", \&kill); # Create a scrollbar to scroll the listbox vertically and add it to $f +rame1. my $scrollbar = $frame1->Scrollbar(orient => "vertical", width => 10, command => ["yview", $process_list] +, )->pack(side => "left", fill => "y" +); $process_list->configure(yscrollcommand => ["set", $scrollbar]); # Create a frame to hold radiobuttons for choosing a signal. my $frame2 = $top->Frame()->pack(); # Create the radiobuttons inside $frame2. $frame2->Label(text => "Choose a signal:")->pack(side => "left"); my $signal = "TERM"; $frame2->Radiobutton(variable => \$signal, text => "Terminate", value => "TERM")->pack(side => "left"); $frame2->Radiobutton(variable => \$signal, text => "Stop", value => "STOP")->pack(side => "left"); $frame2->Radiobutton(variable => \$signal, text => "Continue", value => "CONT")->pack(side => "left"); $frame2->Radiobutton(variable => \$signal, text => "Interrupt", value => "INT")->pack(side => "left"); $frame2->Radiobutton(variable => \$signal, text => "Hangup", value => "HUP")->pack(side => "left"); $frame2->Radiobutton(variable => \$signal, text => "Kill", value => "KILL")->pack(side => "left"); # Hand control of the program off to the GUI. MainLoop(); # Subroutine called when a field in the listbox is double-clicked. # The process ID of the process is the first field in the listbox's ac +tive item. # The signal to send the process is set by the radiobuttons and stored + in # the variable $signal. sub kill { my $process = $process_list->get('active'); my ($pid) = split(/ /, $process); return unless $pid; system("kill -s $signal $pid"); }

In reply to by Falkkin

Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post; it's "PerlMonks-approved HTML":

  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.
  • Log In?

    What's my password?
    Create A New User
    and the web crawler heard nothing...

    How do I use this? | Other CB clients
    Other Users?
    Others lurking in the Monastery: (4)
    As of 2016-04-29 06:12 GMT
    Find Nodes?
      Voting Booth?
      :nehw tseb si esrever ni gnitirW

      Results (438 votes). Check out past polls.