diff --git a/src/sbbs3/xtrn.cpp b/src/sbbs3/xtrn.cpp
index 31d7f341fd4bce36c15f2e43faff10dfd06e3ebb..5587286b18c33085e1ae564108eda13a13a657d2 100644
--- a/src/sbbs3/xtrn.cpp
+++ b/src/sbbs3/xtrn.cpp
@@ -332,7 +332,7 @@ static void add_env_var(str_list_t* list, const char* var, const char* val)
 		SetLastError(last_error)
 
 /****************************************************************************/
-/* Runs an external program 												*/
+/* Runs an external program (on Windows) 									*/
 /****************************************************************************/
 int sbbs_t::external(const char* cmdline, int mode, const char* startup_dir)
 {
@@ -1107,6 +1107,9 @@ static int forkpty(int *amaster, char *name, termios *termp, winsize *winp)
 }
 #endif /* NEED_FORKPTY */
 
+/****************************************************************************/
+/* Runs an external program (on *nix) 										*/
+/****************************************************************************/
 int sbbs_t::external(const char* cmdline, int mode, const char* startup_dir)
 {
 	char          str[MAX_PATH + 1];
@@ -1855,6 +1858,7 @@ int sbbs_t::external(const char* cmdline, int mode, const char* startup_dir)
 			fds[1].fd = err_pipe[0];
 			fds[1].events = POLLIN;
 		}
+		time_t lastnodechk = 0;
 		while (!terminated) {
 			if (waitpid(pid, &i, WNOHANG) != 0)    /* child exited */
 				break;
@@ -1909,8 +1913,17 @@ int sbbs_t::external(const char* cmdline, int mode, const char* startup_dir)
 			}
 
 			data_waiting = fds[0].revents;
-			if (i == 0 && data_waiting == 0)
+			if (i == 0 && data_waiting == 0) {
+				// only check node for interrupt flag every 3 seconds of no I/O
+				if (difftime(time(NULL), lastnodechk) >= 3) {
+					if (getnodedat(cfg.node_num, &thisnode)) {
+						if (thisnode.misc & NODE_INTR)
+							break;
+						lastnodechk = time(NULL);
+					}
+				}
 				continue;
+			}
 
 			avail = (RingBufFree(&outbuf) - i) / 2;   // Leave room for wwiv/telnet expansion
 			if (avail == 0) {