将xargs生成的命令发送到后台

Poo*_*zer 12 unix background xargs

我想知道如何将xargs生成的命令发送到后台.例如,考虑一下

find . -type f  -mtime +7 | tee compressedP.list | xargs compress
Run Code Online (Sandbox Code Playgroud)

我试过了

find . -type f  -mtime +7 | tee compressedP.list | xargs -i{} compress {} &
Run Code Online (Sandbox Code Playgroud)

..并且出乎意料的是,它似乎将xargs发送到后台了?

如何使compress命令的每个实例都转到后台?

Rob*_*obM 13

使用--max-procs/ -P选项在后台运行xargs目标.从GNU xargs版本4.2.27的手册页:

--max-procs = max-procs,-P max-procs

一次运行max-procs进程; 默认值为1.如果max-procs为0,则xargs将一次运行尽可能多的进程.将-n选项与-P一起使用; 否则很可能只会有一名执行官.

(您可能希望将其与此相结合,-n 1以确保您要压缩的每个文件都有一个新进程)


gna*_*arf 6

你可以用一个非常快的shellcript来调用compress.

#!/bin/sh 
# call it 'compbg' and chmod a+x
compress $* &
Run Code Online (Sandbox Code Playgroud)

然后

find . -type f  -mtime +7 | tee compressedP.list | xargs -I{} compbg {}
Run Code Online (Sandbox Code Playgroud)

虽然我认为你可能会更乐意使用这个xargs参数:

 -P maxprocs
         Parallel mode: run at most maxprocs invocations of utility at once.
Run Code Online (Sandbox Code Playgroud)

此命令应该一次查找/ tee/compress 10个文件,直到完成为止,并立即将控制权返回给调用脚本/ shell.

find . -type f  -mtime +7 | tee compressedP.list | xargs -I{} -P10 compress {} &
Run Code Online (Sandbox Code Playgroud)


Ole*_*nge 5

对于SunOS,您可以查看GNU Parallel http://www.gnu.org/software/parallel/

find . -type f  -mtime +7 | tee compressedP.list | parallel compress
Run Code Online (Sandbox Code Playgroud)

如果文件名包含'\n'或空格,它还有一个额外的好处:添加-j + 0将使每个CPU核心运行一次压缩.