[PATCH 2/2] start-stop-daemon - find processes better

Denys Vlasenko vda.linux at googlemail.com
Fri May 2 08:43:05 UTC 2008


Hi Roy, Joakim.

Joakim, please scroll down to the end and let me know
what you thing about proposed ssd documentation.


On Thursday 01 May 2008 15:38, Roy Marples wrote:
> > > > It's not a pathname, it's just a "name" (arbitrary)
> > >
> > > Correct. It's a crap option. Gentoo silently remaps it to --exec
> >
> > Are you suggesting to drop it? This risks breaking
> > things for existing users.
> 
> No, I'm suggesting just to remap --startas to --exec

Don't see why it cannot be used as intended - as an argv[0] override.

> > > My view is that it searches for programs started as that.
> > > So if the user launches /usr/sbin/ntpd then ssd should check
> > > /proc/pid/cmdline to see if it was started as /usr/sbin/ntpd and then
> > > match.
> >
> > And what to do if cmdline contains just "ntpd"? or "./ntpd"?
> > Does that match?
> > Do we need to check /proc/$PID/stat? /proc/$PID/exec?
> 
> That's the one hole really :)
> It doesn't match, but then I don't expect it too either. ssd is normally used 
> in scripts, so the way it's started should match the way it's stopped.

I need this to be exactly spelled out.

> > > >         -n,--name process-name  Stop processes with this name
> > > AND don't create a pidfile AND are scripts. Again, this is why we
> > > changed --exec to look at how it was started to solve this problem.
> >
> > How it is different from -x?
> 
> -x is --exec, or did I miss something?

I meant "how --exec is different for --name?"

> > > In normal ssd, -p only matters when stopping. It reads the specified file
> > > and just stops that pid.
> > > However, ssd can also background some daemons which don't by default. Or
> > > which don't create a pidifle by default. So the solution is to run the
> > > daemon in foreground mode in a forked process. We then store that pid in
> > > the pidfile. Example
> > >
> > > start-stop-daemon --start --exec /usr/sbin/daemon --pidfile
> > > /var/run/daemon.pid --make-pidfile -- --foreground --foreground is an
> > > option specific to daemon and not start-stop-daemon.
> >
> > But --make-pidfile seems to be superfluous here... --start + --pidfile FILE
> > imply pidfile creation.

Really? Must be documented. And if --make-pidfile indeed implies
pidfile creation, then it makes no sense. Adding/removing
--make-pidfile to command line chages nothing.

> Not so as --pidfile is used to check processes before the demon starts
> 
> start-stop-daemon --start --exec /usr/bin/foo --pidfile /var/run/foo.pid
> 
> Check that /usr/bin/foo is NOT running on the pidfile in /var/run/foo.pid.
> If not running, start foo, otherwise error.
> ssd should not stamp on pidfiles unless told.


Please review proposed documentation below.

Please spell out how -n NAME and -x NAME are different in respect
to stopping the processes. To reiterate: we nave 3 different
ideas of "process name":

In Linux we have three ways to determine "process name":
1. /proc/PID/stat has "...(name)...", among other things. It's so-called "comm" field.
2. /proc/PID/cmdline's first NUL-terminated string. It's argv[0] from exec syscall.
3. /proc/PID/exe symlink. Points to the running executable file.
kernel threads:
 comm: thread name
 cmdline: empty
 exe: <readlink fails>
executable
 comm: first 15 chars of base name
 (if executable is a symlink, then first 15 chars of symlink name are used)
 cmdline: argv[0] from exec syscall
 exe: points to executable (resolves symlink, unlike comm)
script (an executable with #!/path/to/interpreter):
 comm: first 15 chars of script's base name (symlinks are not resolved)
 cmdline: /path/to/interpreter (symlinks are not resolved)
 (script name is in argv[1], args are pushed into argv[2] etc)
 exe: points to interpreter's executable (symlinks are resolved)

Which one(s) should be used by -n? -x?




start-stop-daemon [OPTIONS] [--start|--stop] ... [-- arguments...]

One (only) of these must be given:
        -S,--start              Start
        -K,--stop               Stop

start-stop-daemon will first search for matching processes,
stop them (by sending a signal). If --start is given,
it will then start a new process.

Stop options:
        -u,--user USERNAME|UID  Stop this user's processes
        -n,--name PROCESS_NAME  Stop processes with this name ??
        -x,--exec EXECUTABLE    Stop processes with this name ??
        -p,--pidfile PID_FILE   Stop processes with PID from this file
        -s,--signal SIG         Signal to send (default TERM)

Start options:
        -x,--exec EXECUTABLE    Program to run (1st arg of execvp). Mandatory.
        -a,--startas NAME       argv[0] (defults to EXECUTABLE)
        -b,--background         Put process into background
        -N,--nicelevel N        Add N to process's nice level
        -c,--chuid user[:[grp]] Change to specified user/group
        -m,--make-pidfile -p,--pidfile PID_FILE
                                Write PID to the file
                                (both -m and -p must be given!)
Misc options:
        -o,--oknodo             Exit status 0 if nothing done
        -q,--quiet              Quiet
        -v,--verbose            Verbose



--
vda



More information about the busybox mailing list