diff -rpcd a/src/test/regress/pg_regress.c b/src/test/regress/pg_regress.c
*** a/src/test/regress/pg_regress.c	Mon Dec  2 09:17:04 2013
--- b/src/test/regress/pg_regress.c	Wed Dec 25 16:29:24 2013
*************** stop_postmaster(void)
*** 284,301 ****
--- 284,311 ----
  {
  	if (postmaster_running)
  	{
+ #if defined(WIN32) || defined(__CYGWIN__)
  		/* We use pg_ctl to issue the kill and wait for stop */
  		char		buf[MAXPGPATH * 2];
+ #endif
  		int			r;
  
  		/* On Windows, system() seems not to force fflush, so... */
  		fflush(stdout);
  		fflush(stderr);
  
+ #if defined(WIN32) || defined(__CYGWIN__)
  		snprintf(buf, sizeof(buf),
  				 SYSTEMQUOTE "\"%s/pg_ctl\" stop -D \"%s/data\" -s -m fast" SYSTEMQUOTE,
  				 bindir, temp_install);
  		r = system(buf);
+ #else
+ 		/* On UNIX/Linux, pg_ctl times out waiting for a defunct postgres. */
+ 		if (kill(postmaster_pid, SIGINT) != 0)
+ 			fprintf(stderr, _("\n%s: could not kill postmaster: %s\n"),
+ 					progname, strerror(errno));
+ 		(void) waitpid((pid_t) postmaster_pid, &r, 0);
+ #endif
  		if (r != 0)
  		{
  			fprintf(stderr, _("\n%s: could not stop postmaster: exit code was %d\n"),
