Отправка команды, порожденной xargs, в фоновый режим - PullRequest
12 голосов
/ 23 декабря 2009

Я хочу знать, как я могу отправить команды, порожденные xargs, в фоновый режим. Например, рассмотрим

find . -type f  -mtime +7 | tee compressedP.list | xargs compress

Я пытался

find . -type f  -mtime +7 | tee compressedP.list | xargs -i{} compress {} &

.. и как неожиданно вместо этого отправлять xargs на задний план?

Как сделать так, чтобы каждый экземпляр команды сжатия перешел в фоновый режим?

Ответы [ 5 ]

13 голосов
/ 26 мая 2011

Используйте параметр --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, чтобы убедиться, что для каждого файла, который вы хотите сжать, существует новый процесс)

6 голосов
/ 23 декабря 2009

Вы, вероятно, могли бы сделать очень быстрый сценарий для вызова сжатия.

#!/bin/sh 
# call it 'compbg' and chmod a+x
compress $* &

тогда

find . -type f  -mtime +7 | tee compressedP.list | xargs -I{} compbg {}

Хотя я думаю, что вы могли бы быть счастливее, используя этот аргумент xargs:

 -P maxprocs
         Parallel mode: run at most maxprocs invocations of utility at once.

Эта команда должна находить / tee / сжатие 10 файлов за раз до ее завершения, а также немедленно возвращать управление вызывающему скрипту / оболочке.

find . -type f  -mtime +7 | tee compressedP.list | xargs -I{} -P10 compress {} &
5 голосов
/ 10 июня 2010

Для SunOS вы можете взглянуть на GNU Parallel http://www.gnu.org/software/parallel/

find . -type f  -mtime +7 | tee compressedP.list | parallel compress

У него есть дополнительное преимущество: он не выделяется, если имя файла содержит символ '' или пробел. Добавление -j + 0 заставит его выполнить один компресс на ядро ​​ЦП.

2 голосов
/ 02 июля 2010

Это работает для меня, когда я хочу редактировать все файлы, содержащие foo

grep -rl foo ./ | `xargs emacs` &

0 голосов
/ 12 ноября 2018

В SunOS / Solaris заключите команду в вызов sh (или другой оболочки):

find . -type f  -mtime +7 | tee compressedP.list | xargs -Ifname sh -c 'compress fname &'

Это должно запускать компрессии параллельно без дополнительных инструментов.

...