Попробуйте
sysctl -w net.ipv4.conf.eth1.route_localnet=1
или
sysctl -w net.ipv4.conf.all.route_localnet=1
Возможно, вам придется дважды проверить, чтобы ядро поддерживает route_localnet
. Замените eth1 соответствующим образом.
Обратите внимание, что этот route_localnet
отключен по соображениям безопасности.
clone(Process 9099 attached
child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f457c05ca10) = 9099
[pid 9099] clone(Process 9100 attached
child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f457c05ca10) = 9100
[pid 9099] wait4(-1, <unfinished ...>
[pid 9100] execve("/bin/sed", ["sed", "s:\\([^/]\\)[^/]*/:\\1/:g"], [/* 66 vars */]) = 0
Два форка (в современных системах Linux форки выполняются с помощью системного вызова clone
) вызваны тем, что bash оценивает вашу переменную PROMPT_COMMAND
, о которой вы сказали
pwd2=$(sed "s:\([^/]\)[^/]*/:\1/:g" <<<$PWD)
Форки не связаны напрямую с полученным ранее сигналом SIGCHLD.
В руководстве по bash сказано:
Значение переменной PROMPT_COMMAND проверяется непосредственно перед тем, как Bash печатает каждый первичный запрос. Если PROMPT_COMMAND установлена и имеет не нулевое значение, то значение выполняется так же, как если бы оно было набрано в командной строке.
Внутри bash в конечном итоге вызывает parse_and_execute для оценки содержимого PROMPT_COMMAND
. Bash старается минимизировать количество необходимых форков. Для простых утверждений, таких как pwd2=$PWD
, форки не нужны. Для более сложных утверждений может потребоваться одна или несколько развилок. В вашем случае, $( ... )
приводит к форку, pid 9099, оболочки, которая затем оценит команду между скобками. Вызов не встроенной утилиты sed
приводит к еще одной развилке, pid 9100, за которой следует execve команды /bin/sed
.
Что здесь делает sed?
Похоже, он отрезает все символы, кроме первого, имени каждого каталога выше текущего рабочего каталога.