Что произойдет, если выполнить форк до switch_root?

Bash 4.3 и более поздние версииподдерживают «ссылки на имена» или namerefs (аналогичная концепция существует в ksh93, но область видимости раздражает different):

#!/bin/bash

array1=('array1string1' 'array1string2')
array2=('array2string1' 'array2string2')

array_names=('array1' 'array2')

for a in "${array_names[@]}"; do
    declare -n arr="$a"

    for b in "${arr[@]}"; do
        echo "$b"
    done
done

Переменная arrявляется ссылкой на имя, которая действует как псевдоним для именованной переменной (в данном примере это переменная с именем $a).

Без ссылок namerefs в более ранних версиях Bash одним из решений было бы создание нового массива, содержащего все элементы из других массивов:

all=( "${array1[@]}" "${array2[@]}" )

... немного похоже на массив array_namesв вопрос, но с содержимым всех массивов, а затем перебрать "${all[@]}".

Также можно использовать eval, но полученный код выглядит поразительно ужасно.

См. ответ glenn jackman для варианта с переменной косвенностью (представленный в его текущей форме с Bash версии 2).

0
25.06.2018, 22:27
1 ответ

Ответ таков: ничего особенного не происходит. Вы заменяете свой процесс, execing -разветвленный процесс знает только, что его родительский pid равен 1, ему все равно, был ли этот процесс systemd или каким-то initramfs /init. Единственный сомнительный момент заключается в том, что это будет демон без службы systemd, поэтому ведение журнала, перезапуск и т. д. не будут работать должным образом --, если вы специально не создадите свою собственную службу, которая «прикрепляется» к разветвленному процессу (, вероятно. не очень сложно, учитывая, что он должен иметь детерминированный pid и т. д. ).

Обычно не рекомендуется оставлять -код initramfs работающим после обычной загрузки именно по этим причинам, но это не приведет к краху вашей системы. В полях комментариев кhttps://lwn.net/Articles/657345/есть интересные обсуждения, где это кратко обсуждается.

2
28.01.2020, 02:31

Теги

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