Fixed bug #51337: --lb does not kill jobs at sigpipe.

This commit is contained in:
Ole Tange 2017-06-29 12:13:57 +02:00
parent 21d3b7d9be
commit e0baea9a4a
5 changed files with 232 additions and 255 deletions

View file

@ -3723,12 +3723,31 @@ sub tstp {
# 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", $$;
signal_children("TSTP");
}
sub sigpipe {
# Send SIGPIPE signal to all children process groups
# Uses:
# %SIG
# Returns: N/A
signal_children("PIPE");
}
sub signal_children {
# Send signal to all children process groups
# and GNU Parallel itself
# Uses:
# %SIG
# Returns: N/A
my $signal = shift;
kill $signal, map { -$_ } keys %Global::running;
# Use default signal handler for GNU Parallel itself
$SIG{$signal} = undef;
kill $signal, $$;
}
sub save_original_signal_handler {
# Remember the original signal handler
# Uses:
@ -3747,6 +3766,7 @@ sub save_original_signal_handler {
$SIG{ALRM} = 'IGNORE';
# Allow Ctrl-Z to suspend and `fg` to continue
$SIG{TSTP} = \&tstp;
$SIG{PIPE} = \&sigpipe;
$SIG{CONT} = sub {
# Set $SIG{TSTP} again (it is undef'ed in tstp() )
$SIG{TSTP} = \&tstp;

View file

@ -4470,7 +4470,9 @@ Your bug report should always include:
=item *
The error message you get (if any).
The error message you get (if any). If the error message is not from
GNU B<parallel> you need to show why you think GNU B<parallel> caused
these.
=item *

View file

@ -1040,6 +1040,15 @@ The failed commands can be resumed with:
=back
=head2 DIFFERENCES BETWEEN k-bx/par AND GNU Parallel
kbx requires Haskell to work. This limits the number of platforms this
can work on.
Todo https://github.com/k-bx/par
=head2 DIFFERENCES BETWEEN machma AND GNU Parallel
Todo. Requires Go >= 1.7.

View file

@ -3,7 +3,7 @@
# Simple jobs that never fails
# Each should be taking 1-3s and be possible to run in parallel
# I.e.: No race conditions, no logins
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj0 -k --joblog /tmp/jl-`basename $0` -L1
cat <<'EOF' | sed -e 's/;$/; /;s/$SERVER1/'$SERVER1'/;s/$SERVER2/'$SERVER2'/' | stdout parallel -vj+0 -k --joblog /tmp/jl-`basename $0` -L1
echo "### BUG: The length for -X is not close to max (131072)";
seq 1 60000 | parallel -X echo {.} aa {}{.} {}{}d{} {}dd{}d{.} |head -n 1 |wc
@ -28,48 +28,6 @@ echo '### bug #44546: If --compress-program fails: fail'
parallel --line-buffer --compress-program false echo \;ls ::: /no-existing; echo $?
parallel --compress-program false echo \;ls ::: /no-existing; echo $?
echo 'bug #41613: --compress --line-buffer - no newline';
echo 'pipe compress tagstring'
perl -e 'print "O"'| parallel --compress --tagstring {#} --pipe --line-buffer cat; echo "K"
echo 'pipe compress notagstring'
perl -e 'print "O"'| parallel --compress --pipe --line-buffer cat; echo "K"
echo 'pipe nocompress tagstring'
perl -e 'print "O"'| parallel --tagstring {#} --pipe --line-buffer cat; echo "K"
echo 'pipe nocompress notagstring'
perl -e 'print "O"'| parallel --pipe --line-buffer cat; echo "K"
echo 'nopipe compress tagstring'
parallel --compress --tagstring {#} --line-buffer echo {} O ::: -n; echo "K"
echo 'nopipe compress notagstring'
parallel --compress --line-buffer echo {} O ::: -n; echo "K"
echo 'nopipe nocompress tagstring'
parallel --tagstring {#} --line-buffer echo {} O ::: -n; echo "K"
echo 'nopipe nocompress notagstring'
parallel --line-buffer echo {} O ::: -n; echo "K"
echo 'Compress with failing (de)compressor'
parallel -k --tag --compress --compress-program 'cat;true' --decompress-program 'cat;true' echo ::: tag true true
parallel -k --tag --compress --compress-program 'cat;false' --decompress-program 'cat;true' echo ::: tag false true
parallel -k --tag --compress --compress-program 'cat;false' --decompress-program 'cat;false' echo ::: tag false false
parallel -k --tag --compress --compress-program 'cat;true' --decompress-program 'cat;false' echo ::: tag true false
parallel -k --compress --compress-program 'cat;true' --decompress-program 'cat;true' echo ::: true true
parallel -k --compress --compress-program 'cat;false' --decompress-program 'cat;true' echo ::: false true
parallel -k --compress --compress-program 'cat;false' --decompress-program 'cat;false' echo ::: false false
parallel -k --compress --compress-program 'cat;true' --decompress-program 'cat;false' echo ::: true false
parallel -k --line-buffer --compress --compress-program 'cat;true' --decompress-program 'cat;true' echo ::: line-buffer true true
parallel -k --line-buffer --compress --compress-program 'cat;false' --decompress-program 'cat;true' echo ::: line-buffer false true
parallel -k --line-buffer --compress --compress-program 'cat;false' --decompress-program 'cat;false' echo ::: line-buffer false false
parallel -k --tag --line-buffer --compress --compress-program 'cat;true' --decompress-program 'cat;false' echo ::: tag line-buffer true false
parallel -k --tag --line-buffer --compress --compress-program 'cat;true' --decompress-program 'cat;true' echo ::: tag line-buffer true true
parallel -k --tag --line-buffer --compress --compress-program 'cat;false' --decompress-program 'cat;true' echo ::: tag line-buffer false true
parallel -k --tag --line-buffer --compress --compress-program 'cat;false' --decompress-program 'cat;false' echo ::: tag line-buffer false false
parallel -k --tag --line-buffer --compress --compress-program 'cat;true' --decompress-program 'cat;false' echo ::: tag line-buffer true false
parallel -k --files --compress --compress-program 'cat;true' --decompress-program 'cat;true' echo ::: files true true | parallel rm
parallel -k --files --compress --compress-program 'cat;false' --decompress-program 'cat;true' echo ::: files false true | parallel rm
parallel -k --files --compress --compress-program 'cat;false' --decompress-program 'cat;false' echo ::: files false false | parallel rm
parallel -k --files --compress --compress-program 'cat;true' --decompress-program 'cat;false' echo ::: files true false | parallel rm
echo 'bug #44250: pxz complains File format not recognized but decompresses anyway'
# The first line dumps core if run from make file. Why?!
@ -78,24 +36,6 @@ echo 'bug #44250: pxz complains File format not recognized but decompresses anyw
stdout parallel --compress --compress-program pixz --decompress-program 'pixz -d' true ::: OK-if-no-output
stdout parallel --compress --compress-program pxz true ::: OK-if-no-output
echo 'bug #41613: --compress --line-buffer no newline';
perl -e 'print "It worked"'| parallel --pipe --compress --line-buffer cat; echo
echo 'bug #48658: --linebuffer --files';
doit() { parallel --files --linebuffer --compress-program $1 seq ::: 100000 | wc -l ; };
export -f doit;
parallel --tag -k doit ::: zstd pzstd clzip lz4 lzop pigz pxz gzip plzip pbzip2 lzma xz lzip bzip2 lbzip2 lrz
doit() { parallel --results /tmp/par48658$1 --linebuffer --compress-program $1 seq ::: 100000 | wc -l ; rm -rf "/tmp/par48658$1"; };
export -f doit;
parallel --tag -k doit ::: zstd pzstd clzip lz4 lzop pigz pxz gzip plzip pbzip2 lzma xz lzip bzip2 lbzip2 lrz
doit() { parallel --linebuffer --compress-program $1 seq ::: 100000 | wc -l ; };
export -f doit;
parallel --tag -k doit ::: zstd pzstd clzip lz4 lzop pigz pxz gzip plzip pbzip2 lzma xz lzip bzip2 lbzip2 lrz
echo '**'
echo "### Test -I";
@ -113,6 +53,53 @@ echo "### Test -m -I";
EOF
par_linebuffer_files() {
echo 'bug #48658: --linebuffer --files'
rm -rf /tmp/par48658-*
doit() {
compress="$1"
echo "normal"
parallel --linebuffer --compress-program $compress seq ::: 100000 |
wc -l
echo "--files"
parallel --files --linebuffer --compress-program $1 seq ::: 100000 |
wc -l
echo "--results"
parallel --results /tmp/par48658-$compress --linebuffer --compress-program $compress seq ::: 100000 |
wc -l
rm -rf "/tmp/par48658-$compress"
}
export -f doit
parallel --tag -k doit ::: zstd pzstd clzip lz4 lzop pigz pxz gzip plzip pbzip2 lzma xz lzip bzip2 lbzip2 lrz
}
par_no_newline_compress() {
echo 'bug #41613: --compress --line-buffer - no newline';
pipe_doit() {
tagstring="$1"
compress="$2"
echo tagstring="$tagstring" compress="$compress"
perl -e 'print "O"'|
parallel "$compress" $tagstring --pipe --line-buffer cat
echo "K"
}
export -f pipe_doit
nopipe_doit() {
tagstring="$1"
compress="$2"
echo tagstring="$tagstring" compress="$compress"
parallel "$compress" $tagstring --line-buffer echo {} O ::: -n
echo "K"
}
export -f nopipe_doit
parallel -qk --header : {pipe}_doit {tagstring} {compress} \
::: tagstring '--tagstring {#}' -k \
::: compress --compress -k \
::: pipe pipe nopipe
}
par_failing_compressor() {
echo 'Compress with failing (de)compressor'
echo 'Test --tag/--line-buffer/--files in all combinations'
@ -226,12 +213,32 @@ par_parset() {
echo "${res[9]}"
rm /tmp/parset_input_$$
echo 'or process substitution'
parset res -k echo :::: <(seq 0 10)
echo "${res[0]}"
echo "${res[9]}"
echo 'Commands with newline require -0'
parset var -k -0 ::: 'echo "line1
line2"' 'echo "command2"'
echo "${var[0]}"
}
par_incomplete_linebuffer() {
echo 'bug #51337: --lb does not kill jobs at sigpipe'
cat > /tmp/parallel--lb-test <<'_EOF'
#!/usr/bin/perl
while(1){ print ++$t,"\n"}
_EOF
chmod +x /tmp/parallel--lb-test
parallel --lb /tmp/parallel--lb-test ::: 1 | head
# Should be empty
ps aux | grep parallel[-]-lb-test
}
export -f $(compgen -A function | grep par_)
compgen -A function | grep par_ | sort |
parallel -j6 --tag -k --joblog +/tmp/jl-`basename $0` '{} 2>&1'

View file

@ -87,140 +87,6 @@ parallel: Error: false failed.
1
parallel: Error: false failed.
parallel: Error: false failed.
echo 'bug #41613: --compress --line-buffer - no newline'; echo 'pipe compress tagstring'
bug #41613: --compress --line-buffer - no newline
pipe compress tagstring
perl -e 'print "O"'| parallel --compress --tagstring {#} --pipe --line-buffer cat; echo "K"
1 OK
echo 'pipe compress notagstring'
pipe compress notagstring
perl -e 'print "O"'| parallel --compress --pipe --line-buffer cat; echo "K"
OK
echo 'pipe nocompress tagstring'
pipe nocompress tagstring
perl -e 'print "O"'| parallel --tagstring {#} --pipe --line-buffer cat; echo "K"
1 OK
echo 'pipe nocompress notagstring'
pipe nocompress notagstring
perl -e 'print "O"'| parallel --pipe --line-buffer cat; echo "K"
OK
echo 'nopipe compress tagstring'
nopipe compress tagstring
parallel --compress --tagstring {#} --line-buffer echo {} O ::: -n; echo "K"
1 OK
echo 'nopipe compress notagstring'
nopipe compress notagstring
parallel --compress --line-buffer echo {} O ::: -n; echo "K"
OK
echo 'nopipe nocompress tagstring'
nopipe nocompress tagstring
parallel --tagstring {#} --line-buffer echo {} O ::: -n; echo "K"
1 OK
echo 'nopipe nocompress notagstring'
nopipe nocompress notagstring
parallel --line-buffer echo {} O ::: -n; echo "K"
OK
echo 'Compress with failing (de)compressor'
Compress with failing (de)compressor
parallel -k --tag --compress --compress-program 'cat;true' --decompress-program 'cat;true' echo ::: tag true true
tag tag
true true
true true
parallel -k --tag --compress --compress-program 'cat;false' --decompress-program 'cat;true' echo ::: tag false true
tag tag
false false
true true
parallel: Error: cat;false failed.
parallel: Error: cat;false failed.
parallel: Error: cat;false failed.
parallel -k --tag --compress --compress-program 'cat;false' --decompress-program 'cat;false' echo ::: tag false false
tag tag
false false
false false
parallel: Error: cat;false failed.
parallel: Error: cat;false failed.
parallel: Error: cat;false failed.
parallel -k --tag --compress --compress-program 'cat;true' --decompress-program 'cat;false' echo ::: tag true false
tag tag
true true
false false
parallel -k --compress --compress-program 'cat;true' --decompress-program 'cat;true' echo ::: true true
true
true
parallel -k --compress --compress-program 'cat;false' --decompress-program 'cat;true' echo ::: false true
false
true
parallel: Error: cat;false failed.
parallel: Error: cat;false failed.
parallel -k --compress --compress-program 'cat;false' --decompress-program 'cat;false' echo ::: false false
false
false
parallel: Error: cat;false failed.
parallel: Error: cat;false failed.
parallel -k --compress --compress-program 'cat;true' --decompress-program 'cat;false' echo ::: true false
true
false
parallel -k --line-buffer --compress --compress-program 'cat;true' --decompress-program 'cat;true' echo ::: line-buffer true true
line-buffer
true
true
parallel -k --line-buffer --compress --compress-program 'cat;false' --decompress-program 'cat;true' echo ::: line-buffer false true
line-buffer
false
true
parallel: Error: cat;false failed.
parallel: Error: cat;false failed.
parallel: Error: cat;false failed.
parallel -k --line-buffer --compress --compress-program 'cat;false' --decompress-program 'cat;false' echo ::: line-buffer false false
line-buffer
false
false
parallel: Error: cat;false failed.
parallel: Error: cat;false failed.
parallel: Error: cat;false failed.
parallel -k --tag --line-buffer --compress --compress-program 'cat;true' --decompress-program 'cat;false' echo ::: tag line-buffer true false
tag tag
line-buffer line-buffer
true true
false false
parallel -k --tag --line-buffer --compress --compress-program 'cat;true' --decompress-program 'cat;true' echo ::: tag line-buffer true true
tag tag
line-buffer line-buffer
true true
true true
parallel -k --tag --line-buffer --compress --compress-program 'cat;false' --decompress-program 'cat;true' echo ::: tag line-buffer false true
tag tag
line-buffer line-buffer
false false
true true
parallel: Error: cat;false failed.
parallel: Error: cat;false failed.
parallel: Error: cat;false failed.
parallel: Error: cat;false failed.
parallel -k --tag --line-buffer --compress --compress-program 'cat;false' --decompress-program 'cat;false' echo ::: tag line-buffer false false
tag tag
line-buffer line-buffer
false false
false false
parallel: Error: cat;false failed.
parallel: Error: cat;false failed.
parallel: Error: cat;false failed.
parallel: Error: cat;false failed.
parallel -k --tag --line-buffer --compress --compress-program 'cat;true' --decompress-program 'cat;false' echo ::: tag line-buffer true false
tag tag
line-buffer line-buffer
true true
false false
parallel -k --files --compress --compress-program 'cat;true' --decompress-program 'cat;true' echo ::: files true true | parallel rm
parallel -k --files --compress --compress-program 'cat;false' --decompress-program 'cat;true' echo ::: files false true | parallel rm
parallel: Error: cat;false failed.
parallel: Error: cat;false failed.
parallel: Error: cat;false failed.
parallel -k --files --compress --compress-program 'cat;false' --decompress-program 'cat;false' echo ::: files false false | parallel rm
parallel: Error: cat;false failed.
parallel: Error: cat;false failed.
parallel: Error: cat;false failed.
parallel -k --files --compress --compress-program 'cat;true' --decompress-program 'cat;false' echo ::: files true false | parallel rm
echo 'bug #44250: pxz complains File format not recognized but decompresses anyway'
bug #44250: pxz complains File format not recognized but decompresses anyway
# The first line dumps core if run from make file. Why?!
@ -231,61 +97,6 @@ can not seek in input: Illegal seek
ls: cannot access '/OK-if-missing-file': No such file or directory
stdout parallel --compress --compress-program pixz --decompress-program 'pixz -d' true ::: OK-if-no-output
stdout parallel --compress --compress-program pxz true ::: OK-if-no-output
echo 'bug #41613: --compress --line-buffer no newline'; perl -e 'print "It worked"'| parallel --pipe --compress --line-buffer cat; echo
bug #41613: --compress --line-buffer no newline
It worked
echo 'bug #48658: --linebuffer --files'; doit() { parallel --files --linebuffer --compress-program $1 seq ::: 100000 | wc -l ; }; export -f doit; parallel --tag -k doit ::: zstd pzstd clzip lz4 lzop pigz pxz gzip plzip pbzip2 lzma xz lzip bzip2 lbzip2 lrz
bug #48658: --linebuffer --files
zstd 1
pzstd 1
clzip 1
lz4 1
lzop 1
pigz 1
pxz 1
gzip 1
plzip 1
pbzip2 1
lzma 1
xz 1
lzip 1
bzip2 1
lbzip2 1
lrz 1
doit() { parallel --results /tmp/par48658$1 --linebuffer --compress-program $1 seq ::: 100000 | wc -l ; rm -rf "/tmp/par48658$1"; }; export -f doit; parallel --tag -k doit ::: zstd pzstd clzip lz4 lzop pigz pxz gzip plzip pbzip2 lzma xz lzip bzip2 lbzip2 lrz
zstd 1
pzstd 1
clzip 1
lz4 1
lzop 1
pigz 1
pxz 1
gzip 1
plzip 1
pbzip2 1
lzma 1
xz 1
lzip 1
bzip2 1
lbzip2 1
lrz 1
doit() { parallel --linebuffer --compress-program $1 seq ::: 100000 | wc -l ; }; export -f doit; parallel --tag -k doit ::: zstd pzstd clzip lz4 lzop pigz pxz gzip plzip pbzip2 lzma xz lzip bzip2 lbzip2 lrz
zstd 100000
pzstd 100000
clzip 100000
lz4 100000
lzop 100000
pigz 100000
pxz 100000
gzip 100000
plzip 100000
pbzip2 100000
lzma 100000
xz 100000
lzip 100000
bzip2 100000
lbzip2 100000
lrz 100000
echo '**'
**
echo "### Test -I"; seq 1 10 | parallel -k 'seq 1 {} | parallel -k -I :: echo {} ::'
@ -453,6 +264,131 @@ par_failing_compressor parallel: Error: cat;false failed.
par_failing_compressor parallel -k -k -k -k --compress --compress-program cat\;false --decompress-program cat\;false echo ::: C=cat\;false,D=cat\;false
par_failing_compressor C=cat;false,D=cat;false
par_failing_compressor parallel: Error: cat;false failed.
par_incomplete_linebuffer bug #51337: --lb does not kill jobs at sigpipe
par_incomplete_linebuffer 1
par_incomplete_linebuffer 2
par_incomplete_linebuffer 3
par_incomplete_linebuffer 4
par_incomplete_linebuffer 5
par_incomplete_linebuffer 6
par_incomplete_linebuffer 7
par_incomplete_linebuffer 8
par_incomplete_linebuffer 9
par_incomplete_linebuffer 10
par_linebuffer_files bug #48658: --linebuffer --files
par_linebuffer_files zstd normal
par_linebuffer_files zstd 100000
par_linebuffer_files zstd --files
par_linebuffer_files zstd 1
par_linebuffer_files zstd --results
par_linebuffer_files zstd 1
par_linebuffer_files pzstd normal
par_linebuffer_files pzstd 100000
par_linebuffer_files pzstd --files
par_linebuffer_files pzstd 1
par_linebuffer_files pzstd --results
par_linebuffer_files pzstd 1
par_linebuffer_files clzip normal
par_linebuffer_files clzip 100000
par_linebuffer_files clzip --files
par_linebuffer_files clzip 1
par_linebuffer_files clzip --results
par_linebuffer_files clzip 1
par_linebuffer_files lz4 normal
par_linebuffer_files lz4 100000
par_linebuffer_files lz4 --files
par_linebuffer_files lz4 1
par_linebuffer_files lz4 --results
par_linebuffer_files lz4 1
par_linebuffer_files lzop normal
par_linebuffer_files lzop 100000
par_linebuffer_files lzop --files
par_linebuffer_files lzop 1
par_linebuffer_files lzop --results
par_linebuffer_files lzop 1
par_linebuffer_files pigz normal
par_linebuffer_files pigz 100000
par_linebuffer_files pigz --files
par_linebuffer_files pigz 1
par_linebuffer_files pigz --results
par_linebuffer_files pigz 1
par_linebuffer_files pxz normal
par_linebuffer_files pxz 100000
par_linebuffer_files pxz --files
par_linebuffer_files pxz 1
par_linebuffer_files pxz --results
par_linebuffer_files pxz 1
par_linebuffer_files gzip normal
par_linebuffer_files gzip 100000
par_linebuffer_files gzip --files
par_linebuffer_files gzip 1
par_linebuffer_files gzip --results
par_linebuffer_files gzip 1
par_linebuffer_files plzip normal
par_linebuffer_files plzip 100000
par_linebuffer_files plzip --files
par_linebuffer_files plzip 1
par_linebuffer_files plzip --results
par_linebuffer_files plzip 1
par_linebuffer_files pbzip2 normal
par_linebuffer_files pbzip2 100000
par_linebuffer_files pbzip2 --files
par_linebuffer_files pbzip2 1
par_linebuffer_files pbzip2 --results
par_linebuffer_files pbzip2 1
par_linebuffer_files lzma normal
par_linebuffer_files lzma 100000
par_linebuffer_files lzma --files
par_linebuffer_files lzma 1
par_linebuffer_files lzma --results
par_linebuffer_files lzma 1
par_linebuffer_files xz normal
par_linebuffer_files xz 100000
par_linebuffer_files xz --files
par_linebuffer_files xz 1
par_linebuffer_files xz --results
par_linebuffer_files xz 1
par_linebuffer_files lzip normal
par_linebuffer_files lzip 100000
par_linebuffer_files lzip --files
par_linebuffer_files lzip 1
par_linebuffer_files lzip --results
par_linebuffer_files lzip 1
par_linebuffer_files bzip2 normal
par_linebuffer_files bzip2 100000
par_linebuffer_files bzip2 --files
par_linebuffer_files bzip2 1
par_linebuffer_files bzip2 --results
par_linebuffer_files bzip2 1
par_linebuffer_files lbzip2 normal
par_linebuffer_files lbzip2 100000
par_linebuffer_files lbzip2 --files
par_linebuffer_files lbzip2 1
par_linebuffer_files lbzip2 --results
par_linebuffer_files lbzip2 1
par_linebuffer_files lrz normal
par_linebuffer_files lrz 100000
par_linebuffer_files lrz --files
par_linebuffer_files lrz 1
par_linebuffer_files lrz --results
par_linebuffer_files lrz 1
par_no_newline_compress bug #41613: --compress --line-buffer - no newline
par_no_newline_compress tagstring=--tagstring {#} compress=--compress
par_no_newline_compress 1 OK
par_no_newline_compress tagstring=--tagstring {#} compress=--compress
par_no_newline_compress 1 OK
par_no_newline_compress tagstring=--tagstring {#} compress=-k
par_no_newline_compress 1 OK
par_no_newline_compress tagstring=--tagstring {#} compress=-k
par_no_newline_compress 1 OK
par_no_newline_compress tagstring=-k compress=--compress
par_no_newline_compress OK
par_no_newline_compress tagstring=-k compress=--compress
par_no_newline_compress OK
par_no_newline_compress tagstring=-k compress=-k
par_no_newline_compress OK
par_no_newline_compress tagstring=-k compress=-k
par_no_newline_compress OK
par_parset ### test parset
par_parset Put output into $myarray
par_parset 10
@ -484,6 +420,9 @@ par_parset ~/privat/parallel/testsuite
par_parset You cannot pipe into parset, but must use a tempfile
par_parset 1
par_parset 10
par_parset or process substitution
par_parset 0
par_parset 9
par_parset Commands with newline require -0
par_parset line1
par_parset line2