Reliable process tracking

Tom Rhodes trhodes at FreeBSD.org
Sun Aug 4 14:27:22 UTC 2013


On Sun, 4 Aug 2013 15:46:58 +0200
Jilles Tjoelker <jilles at stack.nl> wrote:

> When shutting down a service or requesting status, rc.subr currently
> uses a combination of pidfiles and process names. This is fairly but not
> completely reliable once it is set up correctly (which can take a lot of
> work and possibly patching the daemon to use pidfile(3) from our
> libutil). It is also incapable of killing multiprocess daemons such as
> CGI web servers without cooperation of the daemon.
> 
> I think what is needed here is a facility that marks a process and all
> of its descendants. Removing the mark should be a privileged or at least
> an unusual operation; no unprivileged function specified by POSIX such
> as setsid() should do this.
> 
> There is no such facility in POSIX, but there are some FreeBSD-specific
> facilities that come close:
> 
> * Do the tracking in userland using kqueue EVFILT_PROC NOTE_TRACK. I
>   think this does not work because there is no way to deal with
>   NOTE_TRACKERR. NOTE_TRACKERR could perhaps be avoided by making fork()
>   fail instead but that may be rather nasty if the tracking process does
>   not call kevent() while many tracked processes are created and
>   destroyed again.
> 
> * Jails. If there were a way to put a process in jail without affecting
>   its privileges, filesystem root directory and network interfaces, this
>   would be usable. Processes cannot escape from a jail and there are
>   ways to signal all processes in a jail or to terminate forcibly all
>   processes in a jail.
> 
> * setloginclass(2). The login class attribute cannot be changed by a
>   normal user, although login(1) and su(1) will change it to the
>   target user's class. The rctl system is also available to limit
>   resources based on login class; this can also be useful to kill all
>   processes with some login class without racing with fork().
> 
> * setlogin(2). Everything except setuid login(1) knows to be careful
>   with this, but breaking getlogin(2) seems unwise. Therefore, this is
>   only useful for daemons with one passwd line per instance.
> 
> Similar facilities in other operating systems: Linux cgroups, Solaris
> process contracts.

There is fscd - it does a lot of what you ask for.  In fact, I had
talked to a few people about bringing it into base but have not
really figured out how I want to integrate it into rc.

--
Tom Rhodes


More information about the freebsd-arch mailing list