]> err.no Git - moreutils/commitdiff
parallel: Allow running independent commands, like `parallel -j3 -- ls df "echo hi"`
authorJoey Hess <joey@gnu.kitenet.net>
Sat, 31 Oct 2009 14:20:08 +0000 (10:20 -0400)
committerJoey Hess <joey@gnu.kitenet.net>
Sat, 31 Oct 2009 14:20:08 +0000 (10:20 -0400)
debian/changelog
parallel.c
parallel.docbook

index 548d3016ddf6763f5f89e83b96c707392f102b4a..00fc01154d6cfb5e8aec5f0de79963d5dd1b47be 100644 (file)
@@ -2,6 +2,8 @@ moreutils (0.38) UNRELEASED; urgency=low
 
   * Description improvements. Closes: #549450
     (Thanks, Justin B Rye)
+  * parallel: Allow running independent commands,
+    like `parallel -j3 -- ls df "echo hi"`
 
  -- Joey Hess <joeyh@debian.org>  Mon, 05 Oct 2009 13:33:07 -0400
 
index 99a9727e0937adc456063826d1caeb581e23bd7d..2358470a29e86ccc296b669f108b2b6b8d7dcf42 100644 (file)
@@ -33,8 +33,9 @@
 #include <unistd.h>
 
 void usage() {
-       printf("parallel [OPTIONS] command -- arguments: for each argument, "
-              "run command with argument\n");
+       printf("parallel [OPTIONS] command -- arguments\n\tfor each argument, "
+              "run command with argument, in parallel\n");
+       printf("parallel [OPTIONS] -- commands\n\trun specified commands in parallel\n");
        exit(1);
 }
 
@@ -49,17 +50,24 @@ void exec_child(char **command, char **arguments, int replace_cb, int nargs) {
        if (replace_cb == 0)
                argc++;
        argv = calloc(sizeof(char*), argc + nargs);
-       for (i = 0; i < argc; i++) {
-               argv[i] = command[i];
-               if (replace_cb && (strcmp(argv[i], "{}") == 0))
-                       argv[i] = arguments[0];
+       if (command[0]) {
+               for (i = 0; i < argc; i++) {
+                       argv[i] = command[i];
+                       if (replace_cb && (strcmp(argv[i], "{}") == 0))
+                               argv[i] = arguments[0];
+               }
+               if (replace_cb == 0)
+                       memcpy(argv + i - 1, arguments, nargs * sizeof(char *));
+               if (fork() == 0) {
+                       /* Child */
+                       execvp(argv[0], argv);
+                       exit(1);
+               }
        }
-       if (replace_cb == 0)
-               memcpy(argv + i - 1, arguments, nargs * sizeof(char *));
-       if (fork() == 0) {
-               /* Child */
-               execvp(argv[0], argv);
-               exit(1);
+       else {
+               if (fork() == 0) {
+                       exit(system(arguments[0]));
+               }
        }
        return;
 }
@@ -92,7 +100,8 @@ int main(int argc, char **argv) {
        int replace_cb = 0;
        char *t;
 
-       while ((opt = getopt(argc, argv, "+hij:l:n:")) != -1) {
+       while ((argv[optind] && strcmp(argv[optind], "--") != 0) &&
+              (opt = getopt(argc, argv, "+hij:l:n:")) != -1) {
                switch (opt) {
                case 'h':
                        usage();
@@ -132,7 +141,7 @@ int main(int argc, char **argv) {
                        break;
                }
        }
-
+       
        if (replace_cb && argsatonce > 1) {
                fprintf(stderr, "options -i and -n are incomaptible\n");
                exit(2);
@@ -146,7 +155,7 @@ int main(int argc, char **argv) {
                maxjobs = 1;
 #endif
        }
-
+       
        while (optind < argc) {
                if (strcmp(argv[optind], "--") == 0) {
                        int i;
@@ -170,6 +179,11 @@ int main(int argc, char **argv) {
                optind++;
        }
 
+       if (argsatonce > 1 && ! command[0]) {
+               fprintf(stderr, "option -n cannot be used without a command\n");
+               exit(2);
+       }
+
        while (argidx < arglen) {
                double load;
 
index 046bb6c26439da5e495aec8bfe835fde99fcec71..b09350d3936847467354454846c0b78df97a7d87 100644 (file)
@@ -37,8 +37,14 @@ Written by Joey Hess
                        <command>parallel</command>
                        <arg>options</arg>
                        <arg>command</arg>
-                       <arg>--</arg>
-                       <arg>arguments</arg>
+                       <command>--</command>
+                       <arg>argument ...</arg>
+               </cmdsynopsis>
+               <cmdsynopsis>
+                       <command>parallel</command>
+                       <arg>options</arg>
+                       <command>--</command>
+                       <arg>command ...</arg>
                </cmdsynopsis>
        </refsynopsisdiv>
        
@@ -50,6 +56,9 @@ Written by Joey Hess
                repeated for each argument. Jobs may be run in
                parallel. The default is to run one job per CPU.</para>
 
+               <para>If no command is specified before the --,
+               the commands after it are instead run in parallel.</para>
+
        </refsect1>
        
        <refsect1>
@@ -122,6 +131,14 @@ Written by Joey Hess
        <para>This runs three ufraw processes at the same time until
        all of the NEF files have been processed.
        </para>
+       
+       <para>
+       <cmdsynopsis>
+               <command>parallel -j 3 -- ls df "echo hi"</command>
+       </cmdsynopsis>
+       </para>
+
+       <para>This runs three independent commands in parallel.</para>
 
        </refsect1>