GNU Parallel: Как я могу сохранить результаты нескольких команд в переменной?

Нет.

Главный процесс обрабатывает смерть своих детей обычным образом.

Это мир POSIX. Если процесс A разветвил B, а процесс B разветвил C, D и E; тогда процесс B - это то, что видит статус SIGCHLD и wait () после завершения C, D и E. Процесс A не знает, что происходит с C, D и E , и это независимо от systemd.

Чтобы A узнал об окончании C, D и E, должны произойти две вещи.

(Можно поумнеть с kevent () на BSD. Но это вопрос Linux.)

2
13.04.2017, 15:36
3 ответа

Я не знаю элегантного способа сделать это. У Сопалахо есть один способ сделать это. Вот еще один, который не использует временные файлы, но который работает неправильно, если вывод содержит \ 377 (ascii 255):

IFS="$(printf "\377")" arr=($(parallel 'echo foo {} ;printf "\377"' ::: a b c))
2
27.01.2020, 21:56

Обходной путь: сохраните результаты в нескольких файлах .
Пример:

parallel {1} '>' comando{#}.txt ::: "${cmds[@]}"

Результаты кажутся нормальными:

luis@Balanceador:~$ ls -la comando*
-rw-r--r--  1 luis  luis  532 Jun 27 00:33 comando1.txt
-rw-r--r--  1 luis  luis    5 Jun 27 00:33 comando2.txt
luis@Balanceador:~$ cat comando1.txt
total 40
drwxr-xr-x   2 luis  luis   512 Jun 27 00:33 .
drwxr-xr-x  13 luis  luis   512 Jun 26 22:50 ..
-rw-r--r--   1 luis  luis     0 Jun 27 00:33 comando1.txt
-rw-r--r--   1 luis  luis     5 Jun 27 00:33 comando2.txt
luis@Balanceador:~$ cat comando2.txt
hola
1
27.01.2020, 21:56

GNU Parallel теперь включает parset:

$ parset arr echo foo {} ::: a b c
$ echo ${arr[0]}
foo a
$ echo ${arr[1]}
foo b
$ echo ${arr[2]}
foo c

$ parset v1,v2,v3 echo foo {} ::: a b c
$ echo $v3
foo c

$ parset "v1 v2 v3" echo foo {} ::: a b c
$ echo $v3
foo c
2
27.01.2020, 21:56

Теги

Похожие вопросы