Главный процесс обрабатывает смерть своих детей обычным образом.
Это мир POSIX. Если процесс A разветвил B, а процесс B разветвил C, D и E; тогда процесс B - это то, что видит статус SIGCHLD
и wait ()
после завершения C, D и E. Процесс A не знает, что происходит с C, D и E , и это независимо от systemd.
Чтобы A узнал об окончании C, D и E, должны произойти две вещи.
service-manager
. exit ()
. Сервисы, которые глупо, ошибочно и тщетно пытаются «демонизировать» себя, делают это. (Можно поумнеть с kevent ()
на BSD. Но это вопрос Linux.)
Я не знаю элегантного способа сделать это. У Сопалахо есть один способ сделать это. Вот еще один, который не использует временные файлы, но который работает неправильно, если вывод содержит \ 377 (ascii 255):
IFS="$(printf "\377")" arr=($(parallel 'echo foo {} ;printf "\377"' ::: a b c))
Обходной путь: сохраните результаты в нескольких файлах .
Пример:
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
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