From 02d04216ff7a00a647b3a2abf839150bc53436ea Mon Sep 17 00:00:00 2001 From: Moe Jette <jette1@llnl.gov> Date: Tue, 15 Feb 2011 17:50:33 +0000 Subject: [PATCH] -- Add new SLURM configure time parameter of --enable-salloc-background. If set, then salloc can execute in the background. Otherwise a message will be printed and the job allocation halted until brought into the foreground. --- NEWS | 3 ++ auxdir/x_ac_debug.m4 | 17 ++++++++++++ config.h.in | 3 ++ configure | 66 ++++++++++++++++++++++++++++++-------------- src/salloc/salloc.c | 21 +++++++++----- 5 files changed, 83 insertions(+), 27 deletions(-) diff --git a/NEWS b/NEWS index 4058bd24df2..4a0d4725c0f 100644 --- a/NEWS +++ b/NEWS @@ -39,6 +39,9 @@ documents those changes that are of interest to users and admins. -- BLUEGENE - Fix for bad conn-type set when running small blocks in HTC mode. -- If salloc's --no-shell option is used, then do not attempt to preserve the terminal's state. + -- Add new SLURM configure time parameter of --enable-salloc-background. If + set, then salloc can execute in the background. Otherwise a message will be + printed and the job allocation halted until brought into the foreground. * Changes in SLURM 2.2.1 ======================== diff --git a/auxdir/x_ac_debug.m4 b/auxdir/x_ac_debug.m4 index a645088dcf1..5fb7d73cde9 100644 --- a/auxdir/x_ac_debug.m4 +++ b/auxdir/x_ac_debug.m4 @@ -91,5 +91,22 @@ AC_DEFUN([X_AC_DEBUG], [ fi AC_MSG_RESULT([${x_ac_partial_attach=no}]) + + AC_MSG_CHECKING([whether to permit salloc to execute in the background]) + AC_ARG_ENABLE( + [salloc-background], + AS_HELP_STRING(--enable-salloc-background,enable salloc to execute in the background), + [ case "$enableval" in + yes) x_ac_salloc_background=yes ;; + no) x_ac_salloc_background=no ;; + *) AC_MSG_RESULT([doh!]) + AC_MSG_ERROR([bad value "$enableval" for --enable-salloc-background]) ;; + esac + ] + ) + if test "$x_ac_salloc_background" = yes; then + AC_DEFINE(SALLOC_RUN_BACKGROUND, 1, [Define to 1 to permit salloc to run in the background.]) + fi + AC_MSG_RESULT([${x_ac_salloc_background=no}]) ] ) diff --git a/config.h.in b/config.h.in index 9964e62898e..01000f87c96 100644 --- a/config.h.in +++ b/config.h.in @@ -389,6 +389,9 @@ /* Define the project's release. */ #undef RELEASE +/* Define to 1 to permit salloc to run in the background. */ +#undef SALLOC_RUN_BACKGROUND + /* Define to 1 if sched_getaffinity takes three arguments. */ #undef SCHED_GETAFFINITY_THREE_ARGS diff --git a/configure b/configure index 40f07e42f2c..2341635dadb 100755 --- a/configure +++ b/configure @@ -1014,6 +1014,7 @@ enable_debug enable_memory_leak_debug enable_front_end enable_partial_attach +enable_salloc_background with_slurmctld_port with_slurmd_port with_slurmdbd_port @@ -1691,6 +1692,8 @@ Optional Features: --enable-front-end enable slurmd operation on a front-end --disable-partial-attach disable debugger partial task attach support + --enable-salloc-background + enable salloc to execute in the background --enable-multiple-slurmd enable multiple-slurmd support @@ -7202,13 +7205,13 @@ if test "${lt_cv_nm_interface+set}" = set; then : else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:7205: $ac_compile\"" >&5) + (eval echo "\"\$as_me:7208: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 - (eval echo "\"\$as_me:7208: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval echo "\"\$as_me:7211: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 - (eval echo "\"\$as_me:7211: output\"" >&5) + (eval echo "\"\$as_me:7214: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" @@ -8413,7 +8416,7 @@ ia64-*-hpux*) ;; *-*-irix6*) # Find out which ABI we are using. - echo '#line 8416 "configure"' > conftest.$ac_ext + echo '#line 8419 "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -10202,11 +10205,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:10205: $lt_compile\"" >&5) + (eval echo "\"\$as_me:10208: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:10209: \$? = $ac_status" >&5 + echo "$as_me:10212: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -10541,11 +10544,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:10544: $lt_compile\"" >&5) + (eval echo "\"\$as_me:10547: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:10548: \$? = $ac_status" >&5 + echo "$as_me:10551: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -10646,11 +10649,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:10649: $lt_compile\"" >&5) + (eval echo "\"\$as_me:10652: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:10653: \$? = $ac_status" >&5 + echo "$as_me:10656: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -10701,11 +10704,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:10704: $lt_compile\"" >&5) + (eval echo "\"\$as_me:10707: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:10708: \$? = $ac_status" >&5 + echo "$as_me:10711: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -13085,7 +13088,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 13088 "configure" +#line 13091 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -13181,7 +13184,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 13184 "configure" +#line 13187 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -15137,11 +15140,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:15140: $lt_compile\"" >&5) + (eval echo "\"\$as_me:15143: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:15144: \$? = $ac_status" >&5 + echo "$as_me:15147: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -15236,11 +15239,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:15239: $lt_compile\"" >&5) + (eval echo "\"\$as_me:15242: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:15243: \$? = $ac_status" >&5 + echo "$as_me:15246: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -15288,11 +15291,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:15291: $lt_compile\"" >&5) + (eval echo "\"\$as_me:15294: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:15295: \$? = $ac_status" >&5 + echo "$as_me:15298: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -19428,6 +19431,29 @@ $as_echo "#define DEBUGGER_PARTIAL_ATTACH 1" >>confdefs.h $as_echo "${x_ac_partial_attach=no}" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to permit salloc to execute in the background" >&5 +$as_echo_n "checking whether to permit salloc to execute in the background... " >&6; } + # Check whether --enable-salloc-background was given. +if test "${enable_salloc_background+set}" = set; then : + enableval=$enable_salloc_background; case "$enableval" in + yes) x_ac_salloc_background=yes ;; + no) x_ac_salloc_background=no ;; + *) { $as_echo "$as_me:${as_lineno-$LINENO}: result: doh!" >&5 +$as_echo "doh!" >&6; } + as_fn_error $? "bad value \"$enableval\" for --enable-salloc-background" "$LINENO" 5 ;; + esac + + +fi + + if test "$x_ac_salloc_background" = yes; then + +$as_echo "#define SALLOC_RUN_BACKGROUND 1" >>confdefs.h + + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${x_ac_salloc_background=no}" >&5 +$as_echo "${x_ac_salloc_background=no}" >&6; } + if test "x$ac_debug" = "xtrue"; then DEBUG_MODULES_TRUE= diff --git a/src/salloc/salloc.c b/src/salloc/salloc.c index 4f08da28634..b606afd8d92 100644 --- a/src/salloc/salloc.c +++ b/src/salloc/salloc.c @@ -218,13 +218,17 @@ int main(int argc, char *argv[]) if ((!opt.no_shell) && isatty(STDIN_FILENO)) { bool sent_msg = false; - is_interactive = true; /* * Job control: interactive sub-processes run in the foreground * process group of the controlling terminal. In order to grant * this (tcsetpgrp), salloc needs to be in the foreground first. */ - while (tcgetpgrp(STDIN_FILENO) != (pid = getpgrp())) { + pid = getpgrp(); +#ifdef SALLOC_RUN_BACKGROUND + if (tcgetpgrp(STDIN_FILENO) == pid) + is_interactive = true; +#else + while (tcgetpgrp(STDIN_FILENO) != pid) { if (!sent_msg) { error("Waiting for program to be placed in " "the foreground"); @@ -232,11 +236,14 @@ int main(int argc, char *argv[]) } killpg(pid, SIGTTIN); } - - /* - * Save tty attributes and reset at exit, in case a child - * process died before properly resetting terminal. - */ + is_interactive = true; +#endif + } + /* + * Save tty attributes and reset at exit, in case a child + * process died before properly resetting terminal. + */ + if (is_interactive) { tcgetattr (STDIN_FILENO, &saved_tty_attributes); atexit (_reset_input_mode); } -- GitLab