diff --git a/src/slurmd/slurmstepd/mgr.c b/src/slurmd/slurmstepd/mgr.c
index a8c4922f018efef8a0615a2755f7de7c7741d86a..87b5fdaf04e3fd9938ea11e08dbd963fda7c58fc 100644
--- a/src/slurmd/slurmstepd/mgr.c
+++ b/src/slurmd/slurmstepd/mgr.c
@@ -1192,7 +1192,7 @@ static int exec_wait_signal (struct exec_wait_info *e, slurmd_job_t *job)
 	return (0);
 }
 
-static void prepare_tty (slurmd_job_t *job, slurmd_task_info_t *task)
+static void prepare_stdio (slurmd_job_t *job, slurmd_task_info_t *task)
 {
 #ifdef HAVE_PTY_H
 	if (job->pty && (task->gtid == 0)) {
@@ -1200,8 +1200,10 @@ static void prepare_tty (slurmd_job_t *job, slurmd_task_info_t *task)
 			error("login_tty: %m");
 		else
 			debug3("login_tty good");
+		return;
 	}
 #endif
+	io_dup_stdio(task);
 	return;
 }
 
@@ -1320,9 +1322,12 @@ _fork_all_tasks(slurmd_job_t *job)
 			xsignal_unblock(slurmstepd_blocked_signals);
 
 			/*
-			 *  Setup tty before any setpgid() calls
+			 *  Need to setup stdio before setpgid() is called
+			 *   in case we are setting up a tty. (login_tty()
+			 *   must be called before setpgid() or it is
+			 *   effectively disabled).
 			 */
-			prepare_tty (job, job->task[i]);
+			prepare_stdio (job, job->task[i]);
 
 			/*
 			 *  Block until parent notifies us that it is ok to
diff --git a/src/slurmd/slurmstepd/task.c b/src/slurmd/slurmstepd/task.c
index 390943bb49c86cb777280b992441a7d5a7a75232..0137fdc7edb5f01c90be2a63c84f375a8f60ba99 100644
--- a/src/slurmd/slurmstepd/task.c
+++ b/src/slurmd/slurmstepd/task.c
@@ -83,7 +83,6 @@
 #include "src/common/xmalloc.h"
 
 #include "src/slurmd/slurmd/slurmd.h"
-#include "src/slurmd/slurmstepd/io.h"
 #include "src/slurmd/slurmstepd/pdebug.h"
 #include "src/slurmd/slurmstepd/task.h"
 #include "src/slurmd/slurmstepd/ulimits.h"
@@ -392,9 +391,6 @@ exec_task(slurmd_job_t *job, int i)
 		}
 	}
 
-	if (!job->pty)
-		 io_dup_stdio(task);
-
 	/* task-specific pre-launch activities */
 
 	if (spank_user_task (job, i) < 0) {