parallel: --tty allows for more programs accessing /dev/tty in parallel.

This commit is contained in:
Ole Tange 2018-05-21 10:31:57 +02:00
parent 94ac9fd72c
commit f2b403b7fb
4 changed files with 29 additions and 17 deletions

View file

@ -210,6 +210,11 @@ Quote of the month:
<<>> <<>>
New in this release: New in this release:
* --tty allows for more programs accessing /dev/tty in parallel. Some programs require tty access without using it.
* env_parallel --session will record names in current environment in $PARALLEL_IGNORED_NAMES and exit. It is only used with env_parallel, and can work like --record-env but in a single session.
https://comquest.in/training https://comquest.in/training
https://bash-prompt.net/guides/parallell-bash/ https://bash-prompt.net/guides/parallell-bash/
https://blog.uta.edu/xus/2017/09/29/an-easy-way-to-run-parallel-jobs-on-stampede2/ https://blog.uta.edu/xus/2017/09/29/an-easy-way-to-run-parallel-jobs-on-stampede2/

View file

@ -27,7 +27,20 @@ B<env_parallel> is 100 ms slower at startup than pure GNU
B<parallel>, and takes up to 30% longer to start a job (typically 15 ms). B<parallel>, and takes up to 30% longer to start a job (typically 15 ms).
Due to the problem with environment space (see below) the recommended Due to the problem with environment space (see below) the recommended
usage is: usage is either:
# Do --record-env into $PARALLEL_IGNORED_NAMES
env_parallel --session
# Define whatever you want to use
alias myalias=echo
myvar=it
myfunc() { myalias $1 $myvar works.; }
# env_parallel will not export names in $PARALLEL_IGNORED_NAMES
env_parallel -S localhost myfunc ::: Yay,
Or:
# Record the "clean" environment (this only needs to be run once) # Record the "clean" environment (this only needs to be run once)
env_parallel --record-env env_parallel --record-env
@ -42,7 +55,7 @@ usage is:
# Use --env _ to only transfer the names not in the "empty" environment # Use --env _ to only transfer the names not in the "empty" environment
env_parallel --env _ -S localhost myfunc ::: Yay, env_parallel --env _ -S localhost myfunc ::: Yay,
In B<csh>: In B<csh> B<--session> is not supported:
# Record the "clean" environment (this only needs to be run once) # Record the "clean" environment (this only needs to be run once)
env_parallel --record-env env_parallel --record-env

View file

@ -2449,7 +2449,6 @@ sub __RUNNING_THE_JOBS_AND_PRINTING_PROGRESS__ {}
# $Global::host{$sshlogin} = Pointer to SSHLogin-object # $Global::host{$sshlogin} = Pointer to SSHLogin-object
# $Global::total_running = total number of running jobs # $Global::total_running = total number of running jobs
# $Global::total_started = total jobs started # $Global::total_started = total jobs started
# $Global::tty_taken = is the tty in use by a running job?
# $Global::max_procs_file = filename if --jobs is given a filename # $Global::max_procs_file = filename if --jobs is given a filename
# $Global::JobQueue = JobQueue object for the queue of jobs # $Global::JobQueue = JobQueue object for the queue of jobs
# $Global::timeoutq = queue of times where jobs timeout # $Global::timeoutq = queue of times where jobs timeout
@ -2471,7 +2470,6 @@ sub init_run_jobs {
# Returns: N/A # Returns: N/A
$Global::total_running = 0; $Global::total_running = 0;
$Global::total_started = 0; $Global::total_started = 0;
$Global::tty_taken = 0;
$SIG{USR1} = \&list_running_jobs; $SIG{USR1} = \&list_running_jobs;
$SIG{USR2} = \&toggle_progress; $SIG{USR2} = \&toggle_progress;
if(@opt::basefile) { setup_basefile(); } if(@opt::basefile) { setup_basefile(); }
@ -3927,7 +3925,6 @@ sub reaper {
# Uses: # Uses:
# %Global::sshmaster # %Global::sshmaster
# %Global::running # %Global::running
# $Global::tty_taken
# $opt::timeout # $opt::timeout
# $Global::timeoutq # $Global::timeoutq
# $opt::halt # $opt::halt
@ -3969,10 +3966,6 @@ sub reaper {
debug("run", "seq ",$job->seq()," died (", $job->exitstatus(), ")"); debug("run", "seq ",$job->seq()," died (", $job->exitstatus(), ")");
$job->set_endtime(::now()); $job->set_endtime(::now());
if($stiff == $Global::tty_taken) {
# The process that died had the tty => release it
$Global::tty_taken = 0;
}
my $sshlogin = $job->sshlogin(); my $sshlogin = $job->sshlogin();
$sshlogin->dec_jobs_running(); $sshlogin->dec_jobs_running();
if($job->should_be_retried()) { if($job->should_be_retried()) {
@ -8588,7 +8581,7 @@ sub start {
} }
$job->set_fh(0,"w",$stdin_fh); $job->set_fh(0,"w",$stdin_fh);
if($opt::tee) { $job->set_virgin(0); } if($opt::tee) { $job->set_virgin(0); }
} elsif ($opt::tty and not $Global::tty_taken and -c "/dev/tty" and } elsif ($opt::tty and -c "/dev/tty" and
open(my $devtty_fh, "<", "/dev/tty")) { open(my $devtty_fh, "<", "/dev/tty")) {
# Give /dev/tty to the command if no one else is using it # Give /dev/tty to the command if no one else is using it
# The eval is needed to catch exception from open3 # The eval is needed to catch exception from open3
@ -8605,7 +8598,6 @@ sub start {
|| ::die_bug("open3-/dev/tty"); || ::die_bug("open3-/dev/tty");
1; 1;
}; };
$Global::tty_taken = $pid;
close $devtty_fh; close $devtty_fh;
$job->set_virgin(0); $job->set_virgin(0);
} else { } else {

View file

@ -2041,6 +2041,8 @@ Record names in current environment in B<$PARALLEL_IGNORED_NAMES> and
exit. Only used with B<env_parallel>. Aliases, functions, and exit. Only used with B<env_parallel>. Aliases, functions, and
variables with names in B<$PARALLEL_IGNORED_NAMES> will not be copied. variables with names in B<$PARALLEL_IGNORED_NAMES> will not be copied.
Only supported in B<Ash, Bash, Dash, Ksh, Sh, and Zsh>.
See also B<--env>, B<--record-env>. See also B<--env>, B<--record-env>.
@ -2328,13 +2330,13 @@ Silent. The job to be run will not be printed. This is the default.
Can be reversed with B<-v>. Can be reversed with B<-v>.
=item B<--tty> =item B<--tty> (alpha testing)
Open terminal tty. If GNU B<parallel> is used for starting an Open terminal tty. If GNU B<parallel> is used for starting a program
interactive program then this option may be needed. It will start only that accesses the tty (such as an interactive program) then this
one job at a time (i.e. B<-j1>), not buffer the output (i.e. B<-u>), option may be needed. It will default to starting only one job at a
and it will open a tty for the job. When the job is done, the next job time (i.e. B<-j1>), not buffer the output (i.e. B<-u>), and it will
will get the tty. open a tty for the job.
You can of course override B<-j1> and B<-u>. You can of course override B<-j1> and B<-u>.