diff options
author | znerd <znerd@FreeBSD.org> | 2002-04-08 21:50:23 +0000 |
---|---|---|
committer | znerd <znerd@FreeBSD.org> | 2002-04-08 21:50:23 +0000 |
commit | 50df0999a1723f0043b1abcc4888e3be5eb5eac5 (patch) | |
tree | 9f1a3a1dc655b1dd2c08f35fea9a04b44078e0ae /www/jakarta-tomcat4 | |
parent | 7626e08a893adb8b1e5e38596625468e342f2075 (diff) | |
download | FreeBSD-ports-50df0999a1723f0043b1abcc4888e3be5eb5eac5.zip FreeBSD-ports-50df0999a1723f0043b1abcc4888e3be5eb5eac5.tar.gz |
Daemon control program now checks if process is really
terminated. If not, it will send the process a SIGKILL
after a certain time-out period. The time-out can be
passed to the port Makefile as a parameter.
Improved documentation a bit here and there.
Added some explicit casts to make lint(1) a bit
happier :-)
Applied some refactoring here and there. Moved some
functionality into a new function 'existsProcess'.
Slightly changed the output of the program.
Bumped PORTREVISION.
Diffstat (limited to 'www/jakarta-tomcat4')
-rw-r--r-- | www/jakarta-tomcat4/Makefile | 5 | ||||
-rw-r--r-- | www/jakarta-tomcat4/files/daemonctl.c | 110 |
2 files changed, 94 insertions, 21 deletions
diff --git a/www/jakarta-tomcat4/Makefile b/www/jakarta-tomcat4/Makefile index 84ba2ca..df886ab 100644 --- a/www/jakarta-tomcat4/Makefile +++ b/www/jakarta-tomcat4/Makefile @@ -7,7 +7,7 @@ PORTNAME= jakarta-tomcat PORTVERSION= 4.0.3 -PORTREVISION= 5 +PORTREVISION= 6 CATEGORIES= www java MASTER_SITES= http://jakarta.apache.org/builds/jakarta-tomcat-4.0/release/v${PORTVERSION}/bin/ \ http://www.metaverse.nl/~ernst/ \ @@ -40,6 +40,7 @@ AJP_1_3_PORT?= 8009 STDOUT_LOG= ${LOG_DIR}/stdout.log STDERR_LOG= ${LOG_DIR}/stderr.log AUTO_START?= NO +STOP_TIMEOUT?= 5 PID_FILE= /var/run/${APP_SHORTNAME}.pid REPLACE_FILES= ${FILESDIR}/daemonctl.c \ ${FILESDIR}/tomcatctl.1 \ @@ -66,6 +67,7 @@ pre-install: @${ECHO_CMD} " Logfile stdout: ${STDOUT_LOG}" @${ECHO_CMD} " Logfile stderr: ${STDERR_LOG}" @${ECHO_CMD} " Starting after install: ${AUTO_START}" + @${ECHO_CMD} " Stop time-out: ${STOP_TIMEOUT} sec." @PKG_PREFIX=${PREFIX} ${SH} pkg-install ${PKGNAME} PRE-INSTALL do-install: @@ -98,6 +100,7 @@ do-install: -e "/%%STARTUP_SCRIPT%%/s//${STARTUP_SCRIPT:S/\//\\\//g}/g" \ -e "/%%STDERR_LOG%%/s//${STDERR_LOG:S/\//\\\//g}/g" \ -e "/%%STDOUT_LOG%%/s//${STDOUT_LOG:S/\//\\\//g}/g" \ + -e "/%%STOP_TIMEOUT%%/s//${STOP_TIMEOUT}/g" \ -e "/%%USER%%/s//${USER}/g" \ -e "/%%WARP_PORT%%/s//${WARP_PORT}/g" \ $f > ${WRKDIR}/`basename $f` diff --git a/www/jakarta-tomcat4/files/daemonctl.c b/www/jakarta-tomcat4/files/daemonctl.c index a5436c1..f1af931 100644 --- a/www/jakarta-tomcat4/files/daemonctl.c +++ b/www/jakarta-tomcat4/files/daemonctl.c @@ -4,7 +4,7 @@ * * Daemon control program. * - * $FreeBSD: /tmp/pcvs/ports/www/jakarta-tomcat4/files/Attic/daemonctl.c,v 1.4 2002-04-08 19:19:31 znerd Exp $ + * $FreeBSD: /tmp/pcvs/ports/www/jakarta-tomcat4/files/Attic/daemonctl.c,v 1.5 2002-04-08 21:50:22 znerd Exp $ */ #include <assert.h> @@ -21,8 +21,13 @@ #include <sys/types.h> #include <sys/uio.h> +/* The maximum size of the PID file, in bytes */ #define MAX_FILE_SIZE 32 +/* The interval in seconds between the checks to make sure the process + died after a kill */ +#define STOP_TIME_INTERVAL 1 + #define ERR_ILLEGAL_ARGUMENT 1 #define ERR_PID_FILE_NOT_FOUND 2 #define ERR_PID_FILE_TOO_LARGE 3 @@ -196,8 +201,8 @@ void writePID(int file, int pid) { printf(">> Writing PID file..."); - lseek(file, 0, SEEK_SET); - ftruncate(file, 0); + lseek(file, (off_t) 0, SEEK_SET); + ftruncate(file, (off_t) 0); nbytes = asprintf(&buffer, "%d\n", pid); write(file, buffer, nbytes); printf(" [ DONE ]\n"); @@ -205,6 +210,34 @@ void writePID(int file, int pid) { /** + * Checks if the specified process is running. + * + * @param pid + * the process id, greater than 0. + * + * @return + * 0 if the specified process is not running, a different value otherwise. + */ +int existsProcess(int pid) { + + int result; + + /* Check preconditions */ + assert(pid > 0); + + /* See if the process exists */ + result = kill(pid, 0); + + /* If the result is 0, then the process exists */ + if (result == 0) { + return 1; + } else { + return 0; + } +} + + +/** * Kills the process identified by the specified ID. * * @param pid @@ -213,10 +246,15 @@ void writePID(int file, int pid) { void killProcess(int pid) { int result; + unsigned int waited; + unsigned int forced; + unsigned int interval = STOP_TIME_INTERVAL; + unsigned int timeout = %%STOP_TIMEOUT%%; + /* Check preconditions */ assert(pid > 0); - printf(">> Killing process %d...", pid); + printf(">> Terminating process %d...", pid); result = kill(pid, SIGTERM); if (result < 0) { printf(" [ FAILED ]\n"); @@ -225,7 +263,37 @@ void killProcess(int pid) { exit(ERR_KILL_FAILED); } - printf(" [ DONE ]\n"); + /* Wait until the process is actually killed */ + result = existsProcess(pid); + for (waited=0; result == 1 && waited < timeout; waited += interval) + { + printf("."); + fflush(NULL); + sleep(interval); + result = existsProcess(pid); + } + + /* If the process still exists, then have no mercy and kill it */ + forced = 0; + if (result == 1) { + + /* Force the process to die */ + result = kill(pid, SIGKILL); + if (result == 0) { + forced = 1; + printf(" [ DONE ]\n"); + fprintf(stderr, "%%CONTROL_SCRIPT_NAME%%: Process %d did not terminate within %%STOP_TIMEOUT%% sec. Killed.\n", pid); + } else if (result != ESRCH) { + printf(" [ FAILED ]\n"); + fprintf(stderr, "%%CONTROL_SCRIPT_NAME%%: Unable to kill process %d: ", pid); + perror(NULL); + exit(ERR_KILL_FAILED); + } + } + + if (forced == 0) { + printf(" [ DONE ]\n"); + } } @@ -246,14 +314,14 @@ void start(void) { file = openPIDFile(); pid = readPID(file); - printf(">> Starting %%APP_TITLE%%..."); + printf(">> Starting %%APP_TITLE%% %%PORTVERSION%%..."); if (pid != -1) { /* Check if the process actually exists */ - result = kill(pid, 0); - if (result == 0 || errno != ESRCH) { + result = existsProcess(pid); + if (result == 1) { printf(" [ FAILED ]\n"); - fprintf(stderr, "%%CONTROL_SCRIPT_NAME%%: %%APP_TITLE%% is already running, PID is %d.\n", pid); + fprintf(stderr, "%%CONTROL_SCRIPT_NAME%%: %%APP_TITLE%% %%PORTREVISION%% is already running, PID is %d.\n", pid); exit(ERR_ALREADY_RUNNING); } } @@ -310,7 +378,7 @@ void start(void) { perror(NULL); exit(ERR_STDOUT_LOGFILE_OPEN); } - lseek(stdoutLogFile, 0, SEEK_END); + lseek(stdoutLogFile, (off_t) 0, SEEK_END); /* Open the stderr log file */ stderrLogFile = open("%%STDERR_LOG%%", O_WRONLY); @@ -320,7 +388,7 @@ void start(void) { perror(NULL); exit(ERR_STDERR_LOGFILE_OPEN); } - lseek(stderrLogFile, 0, SEEK_END); + lseek(stderrLogFile, (off_t) 0, SEEK_END); /* Split this process in two */ pid = fork(); @@ -345,7 +413,7 @@ void start(void) { /* Execute the command */ execl("%%JAVA_HOME%%/%%JAVA_CMD%%", "%%JAVA_HOME%%/%%JAVA_CMD%%", "-jar", %%JAVA_ARGS%% "%%JAR_FILE%%", %%JAR_ARGS%% NULL); - fprintf(stderr, "%%CONTROL_SCRIPT_NAME%%: Unable to start %%APP_TITLE%% as '%%JAVA_HOME%%/%%JAVA_CMD%% -jar %%JAR_FILE%%' in %%APP_HOME%%: "); + fprintf(stderr, "%%CONTROL_SCRIPT_NAME%%: Unable to start %%APP_TITLE%% %%PORTVERSION%% since '%%JAVA_HOME%%/%%JAVA_CMD%% -jar %%JAR_FILE%%' in %%APP_HOME%%: "); perror(NULL); } else { printf(" [ DONE ]\n"); @@ -362,17 +430,17 @@ void stop(void) { int pid; /* Open and read the PID file */ - printf(">> Opening PID file (%%PID_FILE%%)..."); + printf(">> Reading PID file (%%PID_FILE%%)..."); file = openPIDFile(); pid = readPID(file); - printf(">> Checking that %%APP_TITLE%% is running..."); + printf(">> Checking if %%APP_TITLE%% %%PORTVERSION%% is running..."); /* If there is a PID, see if the process still exists */ if (pid != -1) { int result = kill(pid, 0); if (result != 0 && errno == ESRCH) { - ftruncate(file, 0); + ftruncate(file, (off_t) 0); pid = -1; } } @@ -380,20 +448,22 @@ void stop(void) { /* If there is no running process, produce an error */ if (pid == -1) { printf(" [ FAILED ]\n"); - fprintf(stderr, "%%CONTROL_SCRIPT_NAME%%: %%APP_TITLE%% is currently not running.\n"); + fprintf(stderr, "%%CONTROL_SCRIPT_NAME%%: %%APP_TITLE%% %%PORTVERSION%% is currently not running.\n"); exit(ERR_NOT_RUNNING); } - printf(" [ DONE ]\n"); + /* Terminate the process */ killProcess(pid); - printf(">> Clearing PID file..."); - ftruncate(file, 0); - printf(" [ DONE ]\n"); + /* Clear the PID file */ + ftruncate(file, (off_t) 0); } +/** + * Restarts the process. If it not currently running, then it will fail. + */ void restart(void) { stop(); start(); |