pg_ctl restart bug

Started by Joe Mitchellalmost 25 years ago8 messagesbugs
Jump to latest
#1Joe Mitchell
jmitchell@greatbridge.com

"pg_ctl restart" fails if anything is quoted in postmaster.opts.

$ pg_ctl restart
Smart Shutdown request at Fri Apr 20 10:11:38 2001
postmaster successfully shut down
postmaster successfully started
/usr/bin/postmaster: invalid argument -- '-D'
Try '/usr/bin/postmaster --help' for more information.

$ cat postmaster.opts
/usr/bin/postmaster '-D' '/var/lib/pgsql/data'

It appears that the script doesn't cause the parameters in
postmaster.opts to get dequoted.
I think this is the source of the problem.

Joe

--
Joe Mitchell
Knowledge Engineer
Great Bridge, LLC
www.greatbridge.com

#2Peter Eisentraut
peter_e@gmx.net
In reply to: Joe Mitchell (#1)
Re: pg_ctl restart bug

jmitchell@greatbridge.com writes:

"pg_ctl restart" fails if anything is quoted in postmaster.opts.

$ pg_ctl restart
Smart Shutdown request at Fri Apr 20 10:11:38 2001
postmaster successfully shut down
postmaster successfully started
/usr/bin/postmaster: invalid argument -- '-D'
Try '/usr/bin/postmaster --help' for more information.

$ cat postmaster.opts
/usr/bin/postmaster '-D' '/var/lib/pgsql/data'

Unless someone can show me a way to extract the command line options out
of the opts file while preserving whitespace in them, I'm going to
eliminate the quotes being put out.

--
Peter Eisentraut peter_e@gmx.net http://funkturm.homeip.net/~peter

#3Tom Lane
tgl@sss.pgh.pa.us
In reply to: Peter Eisentraut (#2)
Re: pg_ctl restart bug

Peter Eisentraut <peter_e@gmx.net> writes:

Unless someone can show me a way to extract the command line options out
of the opts file while preserving whitespace in them, I'm going to
eliminate the quotes being put out.

Won't work if any of the options contain whitespace, which is quite
probable. For example, my postmaster.opts currently contains

/home/postgres/testversion/bin/postmaster '-i' '-o' '-F -S 5120'

Removing the quotes will certainly break this. We need to find a
smarter way for the script to parse the file contents.

regards, tom lane

#4Tom Lane
tgl@sss.pgh.pa.us
In reply to: Peter Eisentraut (#2)
Re: pg_ctl restart bug

pg_ctl restart works fine with this patch, but I'm not sure whether it
breaks useful cases for the other paths:

***************
*** 323,335 ****
shift
po_path=$1
shift
! POSTOPTS=$@
fi
else # -o given
POSTOPTS="-D $PGDATA $POSTOPTS"
fi

! eval '$po_path' '$POSTOPTS' $logopt '&'

      # if had an old lockfile, check to see if we were able to start
      if [ -n "$oldpid" ];then
--- 323,335 ----
  	    shift
              po_path=$1
              shift
! 	    POSTOPTS="$@"
  	fi
      else # -o given
          POSTOPTS="-D $PGDATA $POSTOPTS"
      fi

! eval '$po_path' $POSTOPTS $logopt '&'

# if had an old lockfile, check to see if we were able to start
if [ -n "$oldpid" ];then

regards, tom lane

#5Bruce Momjian
bruce@momjian.us
In reply to: Peter Eisentraut (#2)
Re: pg_ctl restart bug

$ cat postmaster.opts
/usr/bin/postmaster '-D' '/var/lib/pgsql/data'

Unless someone can show me a way to extract the command line options out
of the opts file while preserving whitespace in them, I'm going to
eliminate the quotes being put out.

You know, I looked at that pg_ctl script and couldn't figure out how it
properly passed all the options to the postmaster. Guess it doesn't. :-)

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026
#6Bruce Momjian
bruce@momjian.us
In reply to: Tom Lane (#4)
Re: pg_ctl restart bug

I can assure you that $@ is never the way to go, always use "$@". Not
sure about the second change.

pg_ctl restart works fine with this patch, but I'm not sure whether it
breaks useful cases for the other paths:

***************
*** 323,335 ****
shift
po_path=$1
shift
! POSTOPTS=$@
fi
else # -o given
POSTOPTS="-D $PGDATA $POSTOPTS"
fi

! eval '$po_path' '$POSTOPTS' $logopt '&'

# if had an old lockfile, check to see if we were able to start
if [ -n "$oldpid" ];then
--- 323,335 ----
shift
po_path=$1
shift
! 	    POSTOPTS="$@"
fi
else # -o given
POSTOPTS="-D $PGDATA $POSTOPTS"
fi

! eval '$po_path' $POSTOPTS $logopt '&'

# if had an old lockfile, check to see if we were able to start
if [ -n "$oldpid" ];then

regards, tom lane

---------------------------(end of broadcast)---------------------------
TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 853-3000
  +  If your life is a hard drive,     |  830 Blythe Avenue
  +  Christ can be your backup.        |  Drexel Hill, Pennsylvania 19026
#7Peter Eisentraut
peter_e@gmx.net
In reply to: Tom Lane (#4)
Re: pg_ctl restart bug

Tom Lane writes:

pg_ctl restart works fine with this patch, but I'm not sure whether it
breaks useful cases for the other paths:

Looks good.

--
Peter Eisentraut peter_e@gmx.net http://funkturm.homeip.net/~peter

#8Peter Eisentraut
peter_e@gmx.net
In reply to: Tom Lane (#4)
Re: pg_ctl restart bug

Tom Lane writes:

! eval '$po_path' '$POSTOPTS' $logopt '&'

--- 323,335 ----

! eval '$po_path' $POSTOPTS $logopt '&'

Actually, I think it needs to be "$POSTOPTS" (double quoted), to preserve
whitespace.

peter ~$ opts="-N -o '-F -S'"
peter ~$ eval ./argprint $opts
-N
-o
-F -S
peter ~$ eval ./argprint "$opts"
-N
-o
-F -S
peter ~$ cat argprint
#!/bin/sh

for arg do
echo "$arg"
done

--
Peter Eisentraut peter_e@gmx.net http://funkturm.homeip.net/~peter