Provided by: nbdkit_1.24.1-2ubuntu4_amd64 bug

NAME

       nbdkit-exitwhen-filter - exit gracefully when an event occurs

SYNOPSIS

        nbdkit --filter=exitwhen PLUGIN
                                 [exit-when-file-created=FILENAME]
                                 [exit-when-file-deleted=FILENAME]
                                 [exit-when-pipe-closed=FD]
                                 [exit-when-process-exits=PID]
                                 [exit-when-script=SCRIPT]
                                 [exit-when-poll=SECS]

DESCRIPTION

       "nbdkit-exitwhen-filter" is an nbdkit filter that causes nbdkit to exit gracefully when
       some external event occurs.  Built-in events are: a file being created or deleted, a pipe
       being closed, or a process exiting.  You can also define custom events using an external
       script or command.

       After the event occurs nbdkit refuses new connections, waits for all current clients to
       disconnect, and then exits.

       A similar filter is nbdkit-exitlast-filter(1).  For other ways to ensure that nbdkit exits
       when you want see nbdkit-captive(1) and nbdkit-service(1).

EXAMPLES

        nbdkit --filter=exitwhen memory 1G exit-when-file-created=/tmp/stop

       nbdkit will run normally until something creates /tmp/stop, whereupon nbdkit will refuse
       new connections and exit as soon as the last client has disconnected.  If /tmp/stop exists
       before nbdkit starts, it will exit immediately.

        nbdkit --filter=exitwhen memory 1G exit-when-process-exits=1234

       nbdkit will exit gracefully when PID 1234 exits and all connections close.  If you want to
       exit when the parent process of nbdkit exits, consider using the --exit-with-parent flag
       instead.

PARAMETERS

       You can define multiple "exit-when-*" events on the command line: nbdkit will exit if any
       of the events happens.  If there are no "exit-when-*" events then the filter does nothing.

       exit-when-file-created=FILENAME
       exit-when-file-deleted=FILENAME
           Exit when the named file is created or deleted.

       exit-when-pipe-closed=FD
           The read end of a pipe(2) is passed to nbdkit in the given file descriptor number.
           Exit when the pipe is closed.  The filter does not read any data from the pipe.

       exit-when-process-exits=PID
           Exit when process ID "PID" exits.

           Note there is a small race between passing the process ID to the filter and the filter
           checking it for the first time.  During this window the original PID might exit and an
           unrelated program might get the same PID, thus holding nbdkit open for longer than
           wanted.  The pipe method above is more reliable if you are able to modify the other
           process.

       exit-when-script="SCRIPT"
           Create a custom event using the script or command "SCRIPT".  The "SCRIPT" can be a
           program, shell script or a command with optional parameters.  Note if using a filename
           here: you may need to use the absolute path because nbdkit changes directory when it
           daemonizes.

           The script should exit with code 88 if the event is detected.  The filter does
           different things depending on the exit code of the script:

           0   The event has not been triggered, so nbdkit continues to process requests as
               normal.

           "1-87"
               An error is logged, but the event is not triggered and nbdkit continues to process
               requests as normal.

           88  The event has been triggered.  nbdkit will refuse new connections and exit
               gracefully as soon as all current clients disconnect.

           "89-"
               Exit codes 89 and above are reserved for future use.  The behaviour may change in
               future if scripts return any of these exit codes.

       exit-when-poll=SECS
           When nbdkit is serving clients this filter does not need to poll because it can check
           for events when a client connects or disconnects.  However when nbdkit is idle the
           filter needs to poll for events every "SECS" seconds and if any event happens exit
           immediately.

           The default is 60 seconds.

NOTES

   Compared to --exit-with-parent
       The nbdkit server option --exit-with-parent causes nbdkit to exit when the parent process
       exits.  It seems similar to:

        nbdkit --filter=exitwhen ... exit-when-process-exits=$$

       ($$ is the parent PID of nbdkit).

       But there are significant differences caused by the implementation.  --exit-with-parent is
       implemented using the Linux feature "PR_SET_PDEATHSIG" ("PROC_PDEATHSIG_CTL" on FreeBSD).
       This causes a signal to be sent to the server when the parent process dies.  On receiving
       the signal nbdkit closes client connections and terminates at once.

       On the other hand "exit-when-process-exits" monitors the other process (which does not
       need to be the parent) and shuts down the server in a different way: currently open
       connections are allowed to continue until they close.

       Neither of these methods is completely reliable in all cases: signals can be lost and
       there is a possible (albeit very small) race when passing the PID to
       "exit-when-process-exits".  More reliable methods of clean up are "exit-when-pipe-closed"
       or putting all of the processes into a cgroup.  (See nbdkit-captive(1) and
       nbdkit-service(1)).

FILES

       $filterdir/nbdkit-exitwhen-filter.so
           The filter.

           Use "nbdkit --dump-config" to find the location of $filterdir.

VERSION

       "nbdkit-exitwhen-filter" first appeared in nbdkit 1.24.

SEE ALSO

       nbdkit(1), nbdkit-exitlast-filter(1), nbdkit-ip-filter(1), nbdkit-limit-filter(1),
       nbdkit-rate-filter(1), nbdkit-captive(1), nbdkit-service(1), nbdkit-filter(3),
       nbdkit-plugin(3).

AUTHORS

       Richard W.M. Jones

COPYRIGHT

       Copyright (C) 2020 Red Hat Inc.

LICENSE

       Redistribution and use in source and binary forms, with or without modification, are
       permitted provided that the following conditions are met:

       •   Redistributions of source code must retain the above copyright notice, this list of
           conditions and the following disclaimer.

       •   Redistributions in binary form must reproduce the above copyright notice, this list of
           conditions and the following disclaimer in the documentation and/or other materials
           provided with the distribution.

       •   Neither the name of Red Hat nor the names of its contributors may be used to endorse
           or promote products derived from this software without specific prior written
           permission.

       THIS SOFTWARE IS PROVIDED BY RED HAT AND CONTRIBUTORS ''AS IS'' AND ANY EXPRESS OR IMPLIED
       WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
       FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL RED HAT OR CONTRIBUTORS
       BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
       DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
       OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
       LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
       OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
       POSSIBILITY OF SUCH DAMAGE.