]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
prlimit: add support for executing a command
authorBernhard Voelker <mail@bernhard-voelker.de>
Wed, 16 Nov 2011 16:57:27 +0000 (17:57 +0100)
committerKarel Zak <kzak@redhat.com>
Wed, 23 Nov 2011 11:11:46 +0000 (12:11 +0100)
prlimit.c: Alternatively to applying the limits to an existing process via the
--pid option, allow a command to be executed. Adapted usage() accordingly.

prlimit.1: mention new syntax.

Signed-off-by: Bernhard Voelker <mail@bernhard-voelker.de>
sys-utils/prlimit.1
sys-utils/prlimit.c

index cc40ac4bf1ec6ca1512b2ca60a6185d70bd1eda8..6b912144c964d8007572b4ccc1fe39f889f0985a 100644 (file)
@@ -9,12 +9,22 @@ get and set a process resource limits.
 .SH SYNOPSIS
 .B prlimit
 .RB [options]
-.RB [ \-\-{resource_name}[=limits] ]
+.RB [ \-\-{resource_name}[=limits]
+.RB [ \-\-pid\ PID]
+
+.B prlimit
+.RB [options]
+.RB [ \-\-{resource_name}[=limits]]
+.RB "command " [ argument ...]
 
 .SH DESCRIPTION
 Given a process id and one or more resources, \fBprlimit\fP tries to retrieve
 and/or modify the limits.
 
+When \fIcommand\fR is given,
+.B prlimit
+will run this command with the given arguments.
+
 The \fIlimits\fP format is composed by a soft and a hard (ceiling) value, separated
 by a semicolon (:), in order to modify the existing value(s). If no limits are
 used, \fBprlimit\fP will only display the current values. If one of the values
@@ -92,6 +102,8 @@ of open files to 1024 and 4095, respectively.
 Modify only the soft limit for the amount of processes.
 .IP "\fBprlimit \-\-pid $$ --nproc=unlimited\fP"
 Set the amount of processes for both soft and ceiling values to unlimited.
+.IP "\fBprlimit --cpu=10 sort -u hugefile\fP"
+Set the soft and hard CPU time limit and run 'sort'.
 
 .SH "SEE ALSO"
 .BR prlimit (2),
index bcbfb5a8f7ea2f054cdc56f958e9c4b3e1dfd38b..846695b5a8574f3fc21bada8c11c722c3f8e7b2e 100644 (file)
@@ -152,7 +152,9 @@ static void __attribute__ ((__noreturn__)) usage(FILE * out)
        fputs(USAGE_HEADER, out);
 
        fprintf(out,
-               _(" %s [options]\n"), program_invocation_short_name);
+               _(" %s [options] [-p PID]\n"), program_invocation_short_name);
+       fprintf(out,
+               _(" %s [options] COMMAND\n"), program_invocation_short_name);
 
        fputs(_("\nGeneral Options:\n"), out);
        fputs(_(" -p, --pid <pid>        process id\n"
@@ -521,7 +523,7 @@ int main(int argc, char **argv)
        assert(MAX_RESOURCES == STACK + 1);
 
        while((opt = getopt_long(argc, argv,
-                                "c::d::e::f::i::l::m::n::q::r::s::t::u::v::x::y::p:o:vVh",
+                                "+c::d::e::f::i::l::m::n::q::r::s::t::u::v::x::y::p:o:vVh",
                                 longopts, NULL)) != -1) {
                switch(opt) {
                case 'c':
@@ -608,8 +610,9 @@ int main(int argc, char **argv)
                        break;
                }
        }
-       if (argc > optind)
-               usage(stderr);
+       if (argc > optind && pid)
+               errx(EXIT_FAILURE,
+                       _("--pid option and COMMAND are mutually exclusive"));
 
        if (!ncolumns) {
                /* default columns */
@@ -633,5 +636,11 @@ int main(int argc, char **argv)
        if (!list_empty(&lims))
                show_limits(&lims, tt_flags);
 
+       if (argc > optind) {
+               /* prlimit [options] COMMAND */
+               execvp(argv[optind], &argv[optind]);
+               err(EXIT_FAILURE, _("executing %s failed"), argv[optind]);
+       }
+
        return EXIT_SUCCESS;
 }