Поиск и выполнение нескольких сценариев параллельно

3

G'day,

Я пытался решить эту проблему все утро, но не добился успеха. Я бы хотел найти определенные скрипты в определенной папке и выполнить их все параллельно. Сценарии имеют разные имена, но все они заканчиваются «run.sh». Ниже того, что я пробовал без успеха.

Первый подход заключался в использовании find в комбинации с -execdir. Однако это работает, скрипты выполняются секвенциально. Я хочу, чтобы все сценарии выполнялись одновременно (параллельно). Кажется, нет возможности достичь этого с помощью -execdir

find . -name "*run.sh" -type f -execdir 'nohup' {} '&' \;

Затем я попытался использовать xargs, потому что есть параллельная опция (-P). Я еще не пробовал параллельный параметр, потому что я не могу заставить xargs запускать скрипты в их соответствующих подпапках. Приведенные ниже команды выполняют все скрипты, но делают это в папке, в которой я запускаю команду, поэтому сами скрипты не работают. Сценарии должны выполняться в их собственных подпапках. В приведенном выше примере -execdir делает это в отличие от -exec. Как достичь этого с помощью xargs?

nohup find . -name "*run.sh" -type f | xargs -0 -I{} bash -c f\ \{\}

или

nohup find . -name "*run.sh" -type f | xargs -0 -I{} bash -c "f {}"

или

nohup find . -name "*run.sh" -type f | xargs -0 -I{} bash -c "./{}" 

Я действительно расстроен и надеюсь, что есть кто-то, кто может помочь. Большое вам спасибо!

    
задан coder85 02.12.2014 в 11:39
источник

2 ответа

4

Вдохновленный ответом хоробы:

find . -iname '*run.sh' -printf 'cd %h; ./%f%pr_e%' | xargs -L1 -0 -P0 bash -c

Вы можете использовать -printf для создания командной строки. %h - это каталог, в котором находится файл, а %f - имя файла без пути (базовое имя). Параметр -P разрешает параллелизм в xargs , а -L1 -0 использует одну строку с нулевым завершением для каждой команды.

    
ответ дан muru 02.12.2014 в 12:07
1

Как насчет создания командных строк, которые вы хотите запустить, а затем запустить их?

find . -name '*run.sh' -type f -exec \
    echo 'c={}; cd ${c%/*} && nohup "./${c##*/}" &' \;

Если результат нужен, просто добавьте | bash и снова запустите.

    
ответ дан choroba 02.12.2014 в 11:51