Отпустить управление командной строкой после завершения разветвленного процесса

Вероятно, это делается с помощью функции macvlan. Это позволяет добавлять виртуальные интерфейсы Ethernet поверх существующего аппаратного интерфейса. В вашем случае это можно было бы сделать так:

ip link add link ens1 name eth0 type macvlan

По умолчанию новый интерфейс получает случайно выбранный MAC-адрес индивидуальной рассылки, администрируемый локально. В качестве альтернативы вы можете указать MAC-адрес с помощью address .

0
19.04.2017, 13:24
3 ответа

Измените код с funcall и на funcall . Поскольку функция funcall работает в фоновом режиме, родительский процесс т.е. ваш сценарий ожидает завершения дочернего процесса.

Если вы запустите funcall на переднем плане, ваша программа завершится нормально.

0
28.01.2020, 02:25

После завершения процесса вы уже находитесь в командной строке, но сама подсказка скрыта выводом фоновой части сценария.

Нажатие Enter запустит любую команду, которую вы набрали в командной строке (вероятно, ничего), а затем снова напечатает приглашение, по-видимому, «вернув ваше приглашение».

Чтобы очистить экран после случайного вывода на него, нажмите Ctrl-L.

1
28.01.2020, 02:25

В высшей степени необычно, что разветвленный процесс ожидает сам себя.

Поток управления должен быть

  1. разветвлением процесса
  2. дочерний процесс делает свое дело
  3. родительский процесс делает свое дело и ждет

Это будет выглядеть примерно так

#!/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.

Ваш код запускает дочерний процесс в фоновом режиме и немедленно возвращает управление родительской оболочке. Подсказка может быть немного перепутана выводом скрипта.

Обратите внимание, что у вас также есть несколько ошибок в вашем скрипте:

  1. pid используется как переменная, но должно быть $pid.
  2. Присвоение pid не должно содержать пробелов вокруг =.

Кроме того, выход не нужен.

Урезанный скрипт, который делает то, что вам нужно, это

#!/bin/ksh

echo "program running..."
nohup some_command "$program" >/dev/null 2>&1      
echo "program completed..."      
2
28.01.2020, 02:25

Теги

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