Now after thinking about it again, I found that doing it the way I did it would call kill once for every single line ps returns. Here's a fixed version:
--- /usr/bin/randomplay 2005-09-04 13:57:39.000000000 +0200 +++ randomplay 2005-10-25 12:47:11.000000000 +0200 @@ -67,7 +67,7 @@ eval $regexp_if_statement; } -# KillAll kills the request process ID and all of its children +# KillAll recursively kills the request process ID and all of its children, grandchildren... # This is a bit of a hack--there should be a better way to do this, but I haven't found one. # Normally, kill HUP => -$$ should do the job, except this doesn't work when randomplay itself # is called from a shell script and all output from child processes is redirected to null. @@ -78,8 +78,10 @@ my $pid = shift; local $SIG{HUP} = 'IGNORE'; # don't want to kill ourselves here--shouldn't happen, but just in case. if (open PS, "ps -o pid,ppid |") { + eof PS; # Force ps to run now. Otherwise it would run at the first read operation. + kill HUP => $pid; foreach my $line (<PS>) { - kill HUP => $1 if ($line =~ /^\s*(\d+)\s*(\d+)\s*$/ and ($1 eq $pid or $2 eq $pid)); + KillAll($1) if ($line =~ /^\s*(\d+)\s*(\d+)\s*$/ and ($2 eq $pid)); } close PS; } else { # if we can't read the process table, just try killing the child process group On Mon, Oct 24, 2005 at 04:50:00PM -0400, Adam Kessel wrote: > Thanks. Looks like a good patch. I'll test it out and upload a new version > soon. I hadn't tested randomplay with 'play' before. > > Christopher Zimmermann wrote: > > Package: randomplay > > Version: 0.47 > > Severity: normal > > Tags: patch > > > > Hi, > > randomplay failes to skip tracks played by the play command, which in > > turn runs sox. That's because the KillAll sub is limited to kill only > > the children of a process and not it's grandchildren. I modified it to > > recursively kill all descendants. > > > > Christopher > > > > > > *** patch > > --- /usr/bin/randomplay 2005-09-04 13:57:39.000000000 +0200 > > +++ randomplay 2005-10-24 22:28:43.000000000 +0200 > > @@ -67,7 +67,7 @@ > > eval $regexp_if_statement; > > } > > > > -# KillAll kills the request process ID and all of its children > > +# KillAll recursively kills the request process ID and all of its > > children, grandchildren... > > # This is a bit of a hack--there should be a better way to do this, but I > > haven't found one. > > # Normally, kill HUP => -$$ should do the job, except this doesn't work > > when randomplay itself > > # is called from a shell script and all output from child processes is > > redirected to null. > > @@ -79,7 +79,8 @@ > > local $SIG{HUP} = 'IGNORE'; # don't want to kill ourselves > > here--shouldn't happen, but just in case. > > if (open PS, "ps -o pid,ppid |") { > > foreach my $line (<PS>) { > > - kill HUP => $1 if ($line =~ /^\s*(\d+)\s*(\d+)\s*$/ and ($1 eq $pid > > or $2 eq $pid)); > > + kill HUP => $pid; > > + KillAll($1) if ($line =~ /^\s*(\d+)\s*(\d+)\s*$/ and ($2 eq $pid)); > > } > > close PS; > > } else { # if we can't read the process table, just > > try killing the child process group > > > > > > -- System Information: > > Debian Release: testing/unstable > > APT prefers testing > > APT policy: (500, 'testing') > > Architecture: sparc (sparc64) > > Shell: /bin/sh linked to /bin/dash > > Kernel: Linux 2.6.14-rc4-sparc > > Locale: LANG=C, LC_CTYPE=de_DE (charmap=ISO-8859-1) > > > > Versions of packages randomplay depends on: > > ii libdate-calc-perl 5.4-4 Perl library for accessing > > dates > > ii libmp3-info-perl 1.13-1 Perl MP3::Info - Manipulate / > > fetc > > ii libogg-vorbis-header-perl 0.03-1 perl interface to Ogg Vorbis > > infor > > ii libterm-readkey-perl 2.30-2 A perl module for simple > > terminal > > ii perl 5.8.7-6 Larry Wall's Practical > > Extraction > > > > Versions of packages randomplay recommends: > > ii mpg321 0.2.10.3 A Free command-line mp3 > > player, co > > ii vorbis-tools 1.0.1-1.4 Several Ogg Vorbis Tools > > > > -- no debconf information > > > > > > ------------------------------------------------------------------------ > > > > --- /usr/bin/randomplay 2005-09-04 13:57:39.000000000 +0200 > > +++ randomplay 2005-10-24 22:28:43.000000000 +0200 > > @@ -67,7 +67,7 @@ > > eval $regexp_if_statement; > > } > > > > -# KillAll kills the request process ID and all of its children > > +# KillAll recursively kills the request process ID and all of its > > children, grandchildren... > > # This is a bit of a hack--there should be a better way to do this, but I > > haven't found one. > > # Normally, kill HUP => -$$ should do the job, except this doesn't work > > when randomplay itself > > # is called from a shell script and all output from child processes is > > redirected to null. > > @@ -79,7 +79,8 @@ > > local $SIG{HUP} = 'IGNORE'; # don't want to kill ourselves > > here--shouldn't happen, but just in case. > > if (open PS, "ps -o pid,ppid |") { > > foreach my $line (<PS>) { > > - kill HUP => $1 if ($line =~ /^\s*(\d+)\s*(\d+)\s*$/ and ($1 eq $pid > > or $2 eq $pid)); > > + kill HUP => $pid; > > + KillAll($1) if ($line =~ /^\s*(\d+)\s*(\d+)\s*$/ and ($2 eq $pid)); > > } > > close PS; > > } else { # if we can't read the process table, just > > try killing the child process group > -- To UNSUBSCRIBE, email to [EMAIL PROTECTED] with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]