Re: Graceful Exit?

Stanley Gambarin (gambarin@OpenMarket.com)
Wed, 05 Mar 1997 10:59:42 -0500

Message-Id: <199703051559.KAA22259@u4-138.openmarket.com>
To: Jim Boutcher <jimb@novia.net>
Subject: Re: Graceful Exit? 
In-Reply-To: Your message of "Tue, 04 Mar 1997 03:51:50 CST."
             <01BC284F.66642DA0@208-4-50-41.novia.net> 
Date: Wed, 05 Mar 1997 10:59:42 -0500
From: Stanley Gambarin <gambarin@OpenMarket.com>

> 2) My problem arises when I wish to kill the web server or for some rea=
son the FastCGI process dies(has never happened to me yet, but I've heard=
 it happens).. If I have buffered 9 log entries, they are all lost. It se=
ems to me that the code outside of the FCGI_Accept while loop is never ex=
ecuted. =

> =

> 3) Am I overlooking something? How do I make sure code is ran on proces=
s termination? It would make my life so much easier (and all my CGIs EXTR=
EMELY quicker) if I could "buffer" all file i/o in my FastCGI processes. =
Has anyone done this? =


	One possible way to implement your idea is to use signals to control
the flow of the execution in the fastcgi application.  The example progra=
m
provided below show you how to accomplish this.  A signal handler is =

implemented
so that it flushes the output and then closes the file descriptor.  In th=
is =

way, any information stored in memory will be written out prior to progra=
m
termination.  However, there are fallacies with this approach as to what =

signals can you recieve and from whom do you recieve these signals.  For =

example, using C program below caught all SIGTERM's sent to the fastcgi
process from the shell, but did not catch anything when the server termin=
ated
(even though server sends them SIGTERM as well, I think.. need to take a =
closer
look at the code).  In any case, the main idea is:
	Importance of the data dictates your implementation strategy.  =

If you are implementing a counter, then you don't care if you are off by =
10, =

however, if you are writing to a database, you want to make sure each =

transaction is written out.
						Hope that was of some help.
							Stanley.

P.S. Code below is provided under same terms as stated in the LICENSE =

agreement,
which basically states that you can freely use it but I am not responsibl=
e. I =

tested the below with Apache1.2b4, mod_fastcgi1.4.3 on Solaris2.5.
Some modifications maybe necessary:

static FILE *fp;
void sigfunc(int signo)
{
  fprintf(fp, "Signal %d has been recieved..exiting\n", signo);
  fclose(fp);    /* this does the fflush() */
  exit(1);
}
void main ()
{
    int count =3D 0;
    /* establish signal handler */
    if (signal(SIGTERM, sigfunc) =3D=3D SIG_ERR)
      { =

	perror("Failed signal");
	exit(1);
      }
    fp =3D fopen("/tmp/blahblah", "a+");
    while(FCGI_Accept() >=3D 0) {
        char *contentLength =3D getenv("CONTENT_LENGTH");
        int len;
	printf("Content-type: text/html\r\n"
	       "\r\n"
	       "<title>FastCGI echo</title>"
	       "<h1>FastCGI echo</h1>\n"
               "Request number %d <p>\n", ++count);
	/* log transaction */
	fprintf(fp, "Received request #%d\n", (count)); =

	/* if this is very important transaction, then also */
	/* fflush(fp); */
    }
}