Вероятно, это делается с помощью функции macvlan
. Это позволяет добавлять виртуальные интерфейсы Ethernet поверх существующего аппаратного интерфейса. В вашем случае это можно было бы сделать так:
ip link add link ens1 name eth0 type macvlan
По умолчанию новый интерфейс получает случайно выбранный MAC-адрес индивидуальной рассылки, администрируемый локально. В качестве альтернативы вы можете указать MAC-адрес с помощью address
.
Измените код с funcall и
на funcall
. Поскольку функция funcall
работает в фоновом режиме, родительский процесс т.е. ваш сценарий ожидает завершения дочернего процесса.
Если вы запустите funcall на переднем плане, ваша программа завершится нормально.
После завершения процесса вы уже находитесь в командной строке, но сама подсказка скрыта выводом фоновой части сценария.
Нажатие Enter запустит любую команду, которую вы набрали в командной строке (вероятно, ничего), а затем снова напечатает приглашение, по-видимому, «вернув ваше приглашение».
Чтобы очистить экран после случайного вывода на него, нажмите Ctrl-L.
В высшей степени необычно, что разветвленный процесс ожидает сам себя.
Поток управления должен быть
Это будет выглядеть примерно так
#!/bin/ksh
echo "program running..."
funcall () {
nohup some_command "$program" >/dev/null 2>&1
echo "program completed..."
}
fork () {
funcall &
}
fork
child_pid="$!"
wait "$child_pid"
Обратите внимание, что фоновая обработка процесса вызов funcall
и ожидание возврата вызова функции в этом случае совершенно не нужны, так как функция fork
ничего не делает, пока выполняется funcall
.
Ваш код запускает дочерний процесс в фоновом режиме и немедленно возвращает управление родительской оболочке. Подсказка может быть немного перепутана выводом скрипта.
Обратите внимание, что у вас также есть несколько ошибок в вашем скрипте:
pid
используется как переменная, но должно быть $pid
. pid
не должно содержать пробелов вокруг =
. Кроме того, выход
не нужен.
Урезанный скрипт, который делает то, что вам нужно, это
#!/bin/ksh
echo "program running..."
nohup some_command "$program" >/dev/null 2>&1
echo "program completed..."