Re-fixed bug #46120: Suspend should suspend (at least local) children.

This commit is contained in:
Ole Tange 2015-10-12 02:15:06 +02:00
parent 6775eb3082
commit 6ad2e2bac3
5 changed files with 50 additions and 25 deletions

View file

@ -242,6 +242,8 @@ http://www.researchgate.net/profile/Christoph_Junghans/publication/276178326_TAD
* GNU Parallel is used in youtube-dl-parallel: https://github.com/dlh/youtube-dl-parallel * GNU Parallel is used in youtube-dl-parallel: https://github.com/dlh/youtube-dl-parallel
* A parallel and fast way to download multiple files http://onetipperday.blogspot.com/2015/10/a-parallel-and-fast-way-to-download.html
* Bug fixes and man page updates. * Bug fixes and man page updates.
GNU Parallel - For people who live life in the parallel lane. GNU Parallel - For people who live life in the parallel lane.

View file

@ -297,7 +297,7 @@ sub cat_partial {
# Convert start_end to start_len # Convert start_end to start_len
my @start_len = map { if(++$i % 2) { $start = $_; } else { $_-$start } } @start_end; my @start_len = map { if(++$i % 2) { $start = $_; } else { $_-$start } } @start_end;
return "<". shell_quote_scalar($file) . return "<". shell_quote_scalar($file) .
q{ perl -e 'while(@ARGV) { sysseek(STDIN,shift,0) || die; $left = shift; while($read = sysread(STDIN,$buf, ($left > 32768 ? 32768 : $left))){ $left -= $read; syswrite(STDOUT,$buf); } }' } . q{ perl -e 'while(@ARGV) { sysseek(STDIN,shift,0) || die; $left = shift; while($read = sysread(STDIN,$buf, ($left > 131072 ? 131072 : $left))){ $left -= $read; syswrite(STDOUT,$buf); } }' } .
" @start_len"; " @start_len";
} }
@ -3109,6 +3109,18 @@ sub onall {
sub __SIGNAL_HANDLING__ {} sub __SIGNAL_HANDLING__ {}
sub tstp {
# Send TSTP signal (Ctrl-Z) to all children process groups
# Uses:
# %SIG
# Returns: N/A
kill "TSTP", map { -$_ } keys %Global::running;
# Use default signal handler to suspend GNU Parallel self
$SIG{TSTP} = undef;
kill "TSTP", $$;
}
sub save_original_signal_handler { sub save_original_signal_handler {
# Remember the original signal handler # Remember the original signal handler
# Uses: # Uses:
@ -3126,8 +3138,13 @@ sub save_original_signal_handler {
$SIG{TERM} = sub {}; # Dummy until jobs really start $SIG{TERM} = sub {}; # Dummy until jobs really start
$SIG{ALRM} = 'IGNORE'; $SIG{ALRM} = 'IGNORE';
# Allow Ctrl-Z to suspend and `fg` to continue # Allow Ctrl-Z to suspend and `fg` to continue
$SIG{TSTP} = sub { kill "STOP", map { -$_ } keys %Global::running, $$; }; $SIG{TSTP} = \&tstp;
$SIG{CONT} = sub { kill "CONT", map { -$_ } keys %Global::running, $$; }; $SIG{CONT} = sub {
# Set $SIG{TSTP} again (it is undef'ed in tstp() )
$SIG{TSTP} = \&tstp;
# Send continue signal to all children process groups
kill "CONT", map { -$_ } keys %Global::running;
};
} }
sub list_running_jobs { sub list_running_jobs {
@ -5575,17 +5592,14 @@ sub sshcommand_of_sshlogin {
$SIG{'TERM'} = undef; $SIG{'TERM'} = undef;
# Ignore the 'foo' being printed # Ignore the 'foo' being printed
open(STDOUT,">","/dev/null"); open(STDOUT,">","/dev/null");
# With -tt OpenSSH_3.6.1p2 gives:
# 'tcgetattr: Invalid argument'
# STDERR >/dev/null to ignore # STDERR >/dev/null to ignore
# "process_mux_new_session: tcgetattr: Invalid argument"
open(STDERR,">","/dev/null"); open(STDERR,">","/dev/null");
open(STDIN,"<","/dev/null"); open(STDIN,"<","/dev/null");
# Run a sleep that outputs data, so it will discover # Run a sleep that outputs data, so it will discover
# if the ssh connection closes. # if the ssh connection closes.
my $sleep = ::shell_quote_scalar my $sleep = ::shell_quote_scalar
('$|=1;while(1){sleep 1;print "foo\n"}'); ('$|=1;while(1){sleep 1;print "foo\n"}');
my @master = ($opt::ssh, "-tt", "-MTS", my @master = ($opt::ssh, "-MTS",
$control_path, $serverlogin, "--", "perl", "-e", $control_path, $serverlogin, "--", "perl", "-e",
$sleep); $sleep);
exec(@master); exec(@master);
@ -5899,7 +5913,7 @@ sub slot {
# clear EOF # clear EOF
seek(IN,0,1); seek(IN,0,1);
my $writer_running = kill 0, $writerpid; my $writer_running = kill 0, $writerpid;
$read = sysread(IN,$buf,32768); $read = sysread(IN,$buf,131072);
if($read) { if($read) {
if($first_round) { if($first_round) {
# Only start the command if there any input to process # Only start the command if there any input to process
@ -6047,7 +6061,11 @@ sub empty_input_wrapper {
if(sysread(STDIN, $buf, 1)) { if(sysread(STDIN, $buf, 1)) {
open($fh, "|-", "@ARGV") || die; open($fh, "|-", "@ARGV") || die;
syswrite($fh, $buf); syswrite($fh, $buf);
while($read = sysread(STDIN, $buf, 32768)) { # Align up to 128k block
if($read = sysread(STDIN, $buf, 131071)) {
syswrite($fh, $buf);
}
while($read = sysread(STDIN, $buf, 131072)) {
syswrite($fh, $buf); syswrite($fh, $buf);
} }
close $fh; close $fh;
@ -6412,7 +6430,7 @@ sub total_failed {
$pid = fork || exec $s, "-c", $c; $pid = fork || exec $s, "-c", $c;
open($o,">",$f) || die $!; open($o,">",$f) || die $!;
# cat > $PARALLEL_TMP # cat > $PARALLEL_TMP
while(sysread(STDIN,$buf,32768)){ while(sysread(STDIN,$buf,131072)){
syswrite $o, $buf; syswrite $o, $buf;
} }
close $o; close $o;
@ -6497,7 +6515,7 @@ sub wrapped {
# Prepend: # Prepend:
# < /tmp/foo perl -e 'while(@ARGV) { # < /tmp/foo perl -e 'while(@ARGV) {
# sysseek(STDIN,shift,0) || die; $left = shift; # sysseek(STDIN,shift,0) || die; $left = shift;
# while($read = sysread(STDIN,$buf, ($left > 32768 ? 32768 : $left))){ # while($read = sysread(STDIN,$buf, ($left > 131072 ? 131072 : $left))){
# $left -= $read; syswrite(STDOUT,$buf); # $left -= $read; syswrite(STDOUT,$buf);
# } # }
# }' 0 0 0 11 | # }' 0 0 0 11 |
@ -7630,16 +7648,8 @@ sub normal_print {
} }
seek $in_fh, 0, 0; seek $in_fh, 0, 0;
# $in_fh is now ready for reading at position 0 # $in_fh is now ready for reading at position 0
if($fdno == 2) {
# OpenSSH_3.6.1p2 gives 'tcgetattr: Invalid argument' with -tt
# This is a crappy way of ignoring it.
sysread($in_fh,$buf,1_000);
$buf =~ s/^(client_process_control: )?tcgetattr: Invalid argument\n//;
print $out_fd $buf;
$self->add_returnsize(length $buf);
}
my $outputlength = 0; my $outputlength = 0;
while(sysread($in_fh,$buf,32768)) { while(sysread($in_fh,$buf,131072)) {
print $out_fd $buf; print $out_fd $buf;
$outputlength += length $buf; $outputlength += length $buf;
} }

View file

@ -8,6 +8,13 @@ echo 'bug #46120: Suspend should suspend (at least local) children'
fg; fg;
echo Zero=OK $?' | grep -v '\[1\]' echo Zero=OK $?' | grep -v '\[1\]'
stdout bash -i -c 'echo 1 | stdout /usr/bin/time -f CPUTIME=%U parallel --timeout 5 burnP6 | grep -q CPUTIME=1 &
sleep 1.1;
kill -TSTP -$!;
sleep 5;
fg;
echo Zero=OK $?' | grep -v '\[1\]'
cat <<'EOF' | sed -e 's/;$/; /;' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1 cat <<'EOF' | sed -e 's/;$/; /;' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1
echo '### -L -n with pipe' echo '### -L -n with pipe'
seq 14 | parallel --pipe -k -L 3 -n 2 'cat;echo 6 Ln line record' seq 14 | parallel --pipe -k -L 3 -n 2 'cat;echo 6 Ln line record'

View file

@ -75,11 +75,11 @@ parallel: Error: --pipepart is incompatible with --max-replace-args, --max-lines
echo '### bug #42893: --block should not cause decimals in cat_partial' echo '### bug #42893: --block should not cause decimals in cat_partial'
### bug #42893: --block should not cause decimals in cat_partial ### bug #42893: --block should not cause decimals in cat_partial
seq 100000 >/tmp/parallel-decimal; parallel --dry-run -kvv --pipepart --block 0.12345M -a /tmp/parallel-decimal true; rm /tmp/parallel-decimal seq 100000 >/tmp/parallel-decimal; parallel --dry-run -kvv --pipepart --block 0.12345M -a /tmp/parallel-decimal true; rm /tmp/parallel-decimal
</tmp/parallel-decimal perl -e 'while(@ARGV) { sysseek(STDIN,shift,0) || die; $left = shift; while($read = sysread(STDIN,$buf, ($left > 32768 ? 32768 : $left))){ $left -= $read; syswrite(STDOUT,$buf); } }' 0 0 0 129450 | (true) </tmp/parallel-decimal perl -e 'while(@ARGV) { sysseek(STDIN,shift,0) || die; $left = shift; while($read = sysread(STDIN,$buf, ($left > 131072 ? 131072 : $left))){ $left -= $read; syswrite(STDOUT,$buf); } }' 0 0 0 129450 | (true)
</tmp/parallel-decimal perl -e 'while(@ARGV) { sysseek(STDIN,shift,0) || die; $left = shift; while($read = sysread(STDIN,$buf, ($left > 32768 ? 32768 : $left))){ $left -= $read; syswrite(STDOUT,$buf); } }' 0 0 129450 129450 | (true) </tmp/parallel-decimal perl -e 'while(@ARGV) { sysseek(STDIN,shift,0) || die; $left = shift; while($read = sysread(STDIN,$buf, ($left > 131072 ? 131072 : $left))){ $left -= $read; syswrite(STDOUT,$buf); } }' 0 0 129450 129450 | (true)
</tmp/parallel-decimal perl -e 'while(@ARGV) { sysseek(STDIN,shift,0) || die; $left = shift; while($read = sysread(STDIN,$buf, ($left > 32768 ? 32768 : $left))){ $left -= $read; syswrite(STDOUT,$buf); } }' 0 0 258900 129450 | (true) </tmp/parallel-decimal perl -e 'while(@ARGV) { sysseek(STDIN,shift,0) || die; $left = shift; while($read = sysread(STDIN,$buf, ($left > 131072 ? 131072 : $left))){ $left -= $read; syswrite(STDOUT,$buf); } }' 0 0 258900 129450 | (true)
</tmp/parallel-decimal perl -e 'while(@ARGV) { sysseek(STDIN,shift,0) || die; $left = shift; while($read = sysread(STDIN,$buf, ($left > 32768 ? 32768 : $left))){ $left -= $read; syswrite(STDOUT,$buf); } }' 0 0 388350 129450 | (true) </tmp/parallel-decimal perl -e 'while(@ARGV) { sysseek(STDIN,shift,0) || die; $left = shift; while($read = sysread(STDIN,$buf, ($left > 131072 ? 131072 : $left))){ $left -= $read; syswrite(STDOUT,$buf); } }' 0 0 388350 129450 | (true)
</tmp/parallel-decimal perl -e 'while(@ARGV) { sysseek(STDIN,shift,0) || die; $left = shift; while($read = sysread(STDIN,$buf, ($left > 32768 ? 32768 : $left))){ $left -= $read; syswrite(STDOUT,$buf); } }' 0 0 517800 71095 | (true) </tmp/parallel-decimal perl -e 'while(@ARGV) { sysseek(STDIN,shift,0) || die; $left = shift; while($read = sysread(STDIN,$buf, ($left > 131072 ? 131072 : $left))){ $left -= $read; syswrite(STDOUT,$buf); } }' 0 0 517800 71095 | (true)
echo '### bug #42902: profiles containing arguments with space' echo '### bug #42902: profiles containing arguments with space'
### bug #42902: profiles containing arguments with space ### bug #42902: profiles containing arguments with space
echo "--rpl 'FULLPATH chomp(\$_=\"/bin/bash=\".\`readlink -f \$_\`);' " > ~/.parallel/FULLPATH; parallel -JFULLPATH echo FULLPATH ::: $0 echo "--rpl 'FULLPATH chomp(\$_=\"/bin/bash=\".\`readlink -f \$_\`);' " > ~/.parallel/FULLPATH; parallel -JFULLPATH echo FULLPATH ::: $0

View file

@ -5,6 +5,12 @@ bug #46120: Suspend should suspend (at least local) children
stdout /usr/bin/time -f CPUTIME=%U parallel --timeout 5 burnP6 ::: 1 | grep --colour=auto -q CPUTIME=1 stdout /usr/bin/time -f CPUTIME=%U parallel --timeout 5 burnP6 ::: 1 | grep --colour=auto -q CPUTIME=1
Zero=OK 0 Zero=OK 0
2048 0a:c0:70:5b:ec:f6:c2:de:67:c3:53:7f:29:81:65:54 tange@hk (RSA1)
8192 e1:95:e3:ff:99:a6:3a:b5:53:5a:54:59:d0:72:94:7f /home/tange/.ssh/id_rsa (RSA)
4096 94:2a:e3:cb:6b:66:63:21:13:51:8d:e8:4e:09:49:b2 /home/tange/.ssh/id_rsa_openindiana (RSA)
echo 1 | stdout /usr/bin/time -f CPUTIME=%U parallel --timeout 5 burnP6 | grep --colour=auto -q CPUTIME=1
Zero=OK 0
echo '### -L -n with pipe' echo '### -L -n with pipe'
### -L -n with pipe ### -L -n with pipe
seq 14 | parallel --pipe -k -L 3 -n 2 'cat;echo 6 Ln line record' seq 14 | parallel --pipe -k -L 3 -n 2 'cat;echo 6 Ln line record'