Re: [evlog-dev] [Bug] [PATCH] daemon evlogd, evlnotifyd, evlactiond can be starte d more than once with scripts in /etc/rc.d/init.d/evl*

Hien Nguyen <[email protected]> Thu, 19 Dec 2002 16:44:53 -0800
Newsgroups gmane.linux.kernel.event-logging
Message-ID <[email protected]>
The fixes below have checked in CVS.

Hien.



> ----- Forwarded by Hien Q Nguyen/Beaverton/IBM on 12/19/2002 08:59 AM -----
> |---------+-------------------------------------------->
> |         |           "Zhu, Yi" <[email protected]>     |
> |         |           Sent by:                         |
> |         |           [email protected]|
> |         |           ceforge.net                      |
> |         |                                            |
> |         |                                            |
> |         |           12/19/2002 01:53 AM              |
> |         |                                            |
> |---------+-------------------------------------------->
>   >-----------------------------------------------------------------------------------------------|
>   |                                                                                               |
>   |       To:       "'[email protected]'"                                    |
>   |        <[email protected]>                                               |
>   |       cc:                                                                                     |
>   |       Subject:  [evlog-dev] [Bug] [PATCH] daemon evlogd, evlnotifyd, evlactiond can be starte |
>   |        d more than once with scripts in /etc/rc.d/init.d/evl*                                 |
>   |                                                                                               |
>   |                                                                                               |
>   >-----------------------------------------------------------------------------------------------|
> 
> 
> 
> Hi,
> 
> I found daemon evlogd can be started more than once using
> "/etc/rc.d/init.d/evlog start". Though evlogd.c has some code to prevent
> from being started more than once, the buggy script /etc/rc.d/init.d/evlog
> makes the effort go to waste. It just deleted the pid file
> /var/run/evlogd.pid everytime start() is called!
> 
> I fixed this bug in below patch. If it is not a redhat distribution, we can
> get "Starting enterprise event logger: /sbin/evlogd: Already running.",
> otherwise just "Starting enterprise event logger: " (without the green [ OK
> ]) because the daemon() prevent everything coming out.
> 
> The same thing happens for evlnotifyd, evlactiond but not evlogrmtd,
> because
> the second evlogrmtd cannot bind() successfully and exit. While the pid
> file
> /var/run/evlogrmtd.pid refers to wrong process id.
> 
> 
> diff -Naur evlog/user/cmd/evlactiond/evlactiond.c
> evlog-new/user/cmd/evlactiond/evlactiond.c
> --- evlog/user/cmd/evlactiond/evlactiond.c             2002-08-10
> 01:17:54.000000000 +0800
> +++ evlog-new/user/cmd/evlactiond/evlactiond.c         2002-12-19
> 17:28:35.000000000 +0800
> @@ -408,11 +408,17 @@
>   * RETURN         :
>   *
>   */
> - void
> - _daemonize()
> - {
> +void
> +_daemonize()
> +{
>              pid_t pid;
>              int num_fds, i;
> +
> +            if (_evlValidate_pid(PidFile)) {
> +                        fprintf(stderr, "evlactiond: Already running.\n");
> +                        exit(1);
> +            }
> +
>              /*
>               * Fork a child and let the parent exit. This guarentees that
>               * the first child is not a process group leader.
> @@ -440,7 +446,6 @@
> 
>              (void)signal(SIGHUP, SIG_IGN);
> 
> -
>              if ((pid = fork()) < 0) {
>                          fprintf(stderr,
>                                                  "evlactiond: Cannot fork
> child process.
> Check system process usage.\n");
> @@ -454,18 +459,13 @@
>               * We allow only one instance of this process at a time.
>               *
>               */
> -            if (!_evlValidate_pid(PidFile)) {
> -                        if (!_evlUpdate_pid(PidFile)) {
> +            if (!_evlUpdate_pid(PidFile)) {
>  #if 0
> -                                    LOGERROR(EVLOG_WRITE_PID, "evlactiond:
> Cannot write
> 'evlactiond' PID to '%s' file\n",
> -                                                            PidFile);
> +                        LOGERROR(EVLOG_WRITE_PID, "evlactiond: Cannot
> write
> 'evlactiond' PID to '%s' file\n",
> +                                                PidFile);
>  #endif
> -                                    exit(1);
> -                        }
> -    } else {
> -                        fprintf(stderr, "evlactiond: Already running.\n");
> -                  exit(1);
> -    }
> +                        exit(1);
> +            }
> 
>              /*
>               * Clear any inherited file mode creation mask.
> diff -Naur evlog/user/cmd/evlnotifyd/evlnotifyd.c
> evlog-new/user/cmd/evlnotifyd/evlnotifyd.c
> --- evlog/user/cmd/evlnotifyd/evlnotifyd.c             2002-12-16
> 10:35:12.000000000 +0800
> +++ evlog-new/user/cmd/evlnotifyd/evlnotifyd.c         2002-12-19
> 16:34:45.000000000 +0800
> @@ -351,6 +351,10 @@
> 
>              (void)signal(SIGHUP, SIG_IGN);
> 
> +            if (_evlValidate_pid(PidFile)) {
> +                        fprintf(stderr, "evlnotifyd: Already running.\n");
> +                        exit(1);
> +            }
> 
>              if ((pid = fork()) < 0) {
>                          fprintf(stderr,
> @@ -365,18 +369,13 @@
>               * We allow only one instance of this process at a time.
>               *
>               */
> -            if (!_evlValidate_pid(PidFile)) {
> -                        if (!_evlUpdate_pid(PidFile)) {
> +            if (!_evlUpdate_pid(PidFile)) {
>  #if 0
> -                                    LOGERROR(EVLOG_WRITE_PID, "evlnotifyd:
> Cannot write
> 'evlnotifyd' PID to '%s' file\n",
> -                                                            PidFile);
> +                        LOGERROR(EVLOG_WRITE_PID, "evlnotifyd: Cannot
> write
> 'evlnotifyd' PID to '%s' file\n",
> +                                                PidFile);
>  #endif
> -                                    exit(1);
> -                        }
> -    } else {
> -                        fprintf(stderr, "evlnotifyd: Already running.\n");
> -                  exit(1);
> -    }
> +                        exit(1);
> +            }
> 
>              /*
>               * Clear any inherited file mode creation mask.
> diff -Naur evlog/user/cmd/evlogd/evlogd.c
> evlog-new/user/cmd/evlogd/evlogd.c
> --- evlog/user/cmd/evlogd/evlogd.c         2002-12-16 10:35:14.000000000
> +0800
> +++ evlog-new/user/cmd/evlogd/evlogd.c           2002-12-19
> 16:12:52.000000000 +0800
> @@ -267,6 +267,10 @@
>              for (i=0; i < SHMSZ; i++)
>                          sharedData[i] = 0;
> 
> +            if (_evlValidate_pid(PidFile)) {
> +                        fprintf(stdout, "%s: Already running.\n",
> argv[0]);
> +                        exit(1);
> +            }
>              if (bg) {
>                          /*
>                           * Fork a child and let the parent exit. This
> guarentees
> that
> @@ -305,17 +309,12 @@
>              }
> 
>              /* stuck my process id away */
> -            if (!_evlValidate_pid(PidFile)) {
> -                        if (!_evlUpdate_pid(PidFile)) {
> -                                    mk_evl_rec(&evl_log, LOG_LOGMGMT,
> EVLOG_WRITE_PID,
> -
> LOG_CRIT,"%s: Cannot write
> 'evlogd' PID to '%s' file\n",
> -                                                               argv[0],
> PidFile);
> -                                    exit(1);
> -                        }
> -            } else {
> -                        fprintf(stdout, "%s: Already running.\n",
> argv[0]);
> +            if (!_evlUpdate_pid(PidFile)) {
> +                        mk_evl_rec(&evl_log, LOG_LOGMGMT, EVLOG_WRITE_PID,
> 
> +                                                   LOG_CRIT,"%s: Cannot
> write 'evlogd' PID
> to '%s' file\n",
> +                                                   argv[0], PidFile);
>                          exit(1);
> -            }
> +            }
> 
>              /*
>               * Second child process.
> diff -Naur evlog/user/cmd/evlogd/evlogrmtd.c
> evlog-new/user/cmd/evlogd/evlogrmtd.c
> --- evlog/user/cmd/evlogd/evlogrmtd.c            2002-12-13
> 06:06:14.000000000 +0800
> +++ evlog-new/user/cmd/evlogd/evlogrmtd.c        2002-12-19
> 17:00:01.000000000 +0800
> @@ -365,6 +365,10 @@
> 
>              (void)signal(SIGHUP, SIG_IGN);
> 
> +            if (_evlValidate_pid(PidFile)) {
> +                        fprintf(stderr, "evlogrmtd: Already running.\n");
> +                        exit(1);
> +            }
> 
>              if ((pid = fork()) < 0) {
>                          fprintf(stderr,
> @@ -379,18 +383,13 @@
>               * We allow only one instance of this process at a time.
>               *
>               */
> -            if (!_evlValidate_pid(PidFile)) {
> -                        if (!_evlUpdate_pid(PidFile)) {
> +            if (!_evlUpdate_pid(PidFile)) {
>  #if 0
> -                                    LOGERROR(EVLOG_WRITE_PID, "evlogrmtd:
> Cannot write
> 'evlogrmtd' PID to '%s' file\n",
> -                                                             PidFile);
> +                        LOGERROR(EVLOG_WRITE_PID, "evlogrmtd: Cannot write
> 'evlogrmtd' PID to '%s' file\n",
> +                                                 PidFile);
>  #endif
> -                                    exit(1);
> -                        }
> -    } else {
> -                        fprintf(stderr, "evlogrmtd: Already running.\n");
> -                  exit(1);
> -    }
> +                        exit(1);
> +            }
> 
>              /*
>               * Clear any inherited file mode creation mask.
> diff -Naur evlog/user/sysfiles/etc/init.d/evlaction
> evlog-new/user/sysfiles/etc/init.d/evlaction
> --- evlog/user/sysfiles/etc/init.d/evlaction           2002-12-16
> 10:35:29.000000000 +0800
> +++ evlog-new/user/sysfiles/etc/init.d/evlaction             2002-12-19
> 17:32:27.
> 000000000 +0800
> @@ -25,18 +25,12 @@
>  start() {
>              echo -n $"Starting notification action daemon: "
> 
> -            if [ -e /var/lock/subsys/evlaction ]
> -            then
> -                        # this means system not shutdown gracefully
> -                        rm -f /var/run/evlactiond.pid
> -            fi
> -
>              if [ ! -z "$REDHAT" ]
> -            then
> +            then
>                          daemon /sbin/evlactiond
> -    else
> +            else
>                          /sbin/evlactiond
> -            fi
> +            fi
> 
>              RETVAL=$?
>              echo
> @@ -45,10 +39,11 @@
>  }
>  stop() {
>              echo -n $"Shutting down notification action daemon: "
> +
>              if [ ! -z "$REDHAT" ]
> -            then
> +            then
>                          killproc evlactiond
> -    else
> +            else
>                          PID=`ps -ef | grep evlactiond | grep -v grep | awk
> '{print
> $2}'`
>                          if [ ! -z "$PID" ]
>                          then
> @@ -64,7 +59,7 @@
>              then
>                          rm -f /var/run/evlactiond.pid
>              fi
> -
> +
>              return $RETVAL
>  }
>  rhstatus() {
> diff -Naur evlog/user/sysfiles/etc/init.d/evlnotify
> evlog-new/user/sysfiles/etc/init.d/evlnotify
> --- evlog/user/sysfiles/etc/init.d/evlnotify           2002-12-16
> 10:35:29.000000000 +0800
> +++ evlog-new/user/sysfiles/etc/init.d/evlnotify             2002-12-19
> 17:32:57.
> 000000000 +0800
> @@ -25,12 +25,6 @@
>  start() {
>              echo -n $"Starting enterprise event log notification: "
> 
> -            if [ -e /var/lock/subsys/evlnotify ]
> -            then
> -                        # this means system not shutdown gracefully
> -                        rm -f /var/run/evlnotifyd.pid
> -            fi
> -
>              if [ ! -z "$REDHAT" ]
>              then
>                          daemon /sbin/evlnotifyd
> @@ -47,7 +41,7 @@
>              echo -n $"Shutting down enterprise event log notification: "
> 
>              if [ ! -z "$REDHAT" ]
> -            then
> +            then
>                          killproc evlnotifyd
>              else
>                          PID=`ps -ef | grep evlnotifyd | grep -v grep | awk
> '{print
> $2}'`
> @@ -56,16 +50,16 @@
>                                      kill -s SIGTERM $PID
>                          fi
>              fi
> -
> +
>              RETVAL=$?
>              echo
>              rm -f /var/lock/subsys/evlnotify
> -
> +
>              if [ -e /var/run/evlnotifyd.pid ]
>              then
>                          rm -f /var/run/evlnotifyd.pid
>              fi
> -
> +
>              return $RETVAL
>  }
>  rhstatus() {
> diff -Naur evlog/user/sysfiles/etc/init.d/evlog
> evlog-new/user/sysfiles/etc/init.d/evlog
> --- evlog/user/sysfiles/etc/init.d/evlog         2002-12-16
> 10:35:29.000000000 +0800
> +++ evlog-new/user/sysfiles/etc/init.d/evlog           2002-12-19
> 16:16:48.000000000 +0800
> @@ -31,12 +31,6 @@
>  start() {
>              echo -n $"Starting enterprise event logger: "
> 
> -            if [ -e /var/lock/subsys/evlog ]
> -            then
> -                        # this means system not shutdown gracefully
> -                        rm -f /var/run/evlogd.pid
> -            fi
> -
>              record_last_recid /var/evlog/eventlog /var/evlog/bootrecid
>              record_last_recid /var/evlog/privatelog /var/evlog/pbootrecid
> 
> diff -Naur evlog/user/sysfiles/etc/init.d/evlogrmt
> evlog-new/user/sysfiles/etc/init.d/evlogrmt
> --- evlog/user/sysfiles/etc/init.d/evlogrmt            2002-12-13
> 09:10:56.000000000 +0800
> +++ evlog-new/user/sysfiles/etc/init.d/evlogrmt        2002-12-19
> 16:51:58.000000000 +0800
> @@ -31,13 +31,6 @@
>  start() {
>              echo -n $"Starting remote event logger: "
> 
> -            if [ -e /var/lock/subsys/evlogrmt ]
> -            then
> -                        # this means system not shutdown gracefully
> -                        rm -f /var/run/evlogrmtd.pid
> -            fi
> -
> -
>              if [ ! -z "$REDHAT" ]
>              then
>                          daemon /sbin/evlogrmtd
> 
> 
> Thanks,
> ----------------------------------------------------------------------------
> 
> ----------------------------------------------------
> Opinions expressed are those of the author and do not represent Intel Corp.
> 
> Zhu Yi (Chuyee)
> Intel China Software Lab (ICSL)
> 22nd Floor, ShanghaiMart Tower No. 2299 Yan'an Road(West) Shanghai 200336,
> PRC
> Tel: 8621-52574545-1261 Fax: 8621-62366119
> 
> GnuPG v1.0.6 (GNU/Linux)
> http://cn.geocities.com/chewie_chuyee/gpg.txt
> 1024D/71C34820 C939 2B0B FBCE 1D51 109A  55E5 8650 DB90 71C3 4820
> 
> 
> -------------------------------------------------------
> This SF.NET email is sponsored by: Geek Gift Procrastinating?
> Get the perfect geek gift now!  Before the Holidays pass you by.
> T H I N K G E E K . C O M      http://www.thinkgeek.com/sf/
> _______________________________________________
> evlog-developers mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/evlog-developers
> 
> 
> 
> 




-------------------------------------------------------
This SF.NET email is sponsored by: Geek Gift Procrastinating?
Get the perfect geek gift now!  Before the Holidays pass you by.
T H I N K G E E K . C O M      http://www.thinkgeek.com/sf/