У нас есть скрипт KSH, который запускает процесс с использованием exec и зависает.
Мы хотим иметь возможность запускать его автоматически и поддерживать его в фоновом режиме.

Мы попробовали это:

./myScript.ksh &

Однако это заставило нас ждать в "воздухе", и нам все еще нужно нажать клавишу Enter, чтобы продолжить.

Единственное решение, которое мы нашли, это изменить скрипт так, чтобы он выглядел так:

....
exec <some command> &
exit 0

Без обоих & и exit 0 это не сработало.

Есть лучшее решение?

1 ответ1

1

У меня возникают трудности с принятием вашего первого примера, когда вы начинаете задание в фоновом режиме, и вы говорите, что он остается в воздухе, и вы должны нажать [Enter], чтобы продолжить.

Обратите внимание, что любой вывод, производимый фоновым сценарием, будет напечатан после приглашения оболочки, создавая иллюзию пропущенного приглашения (фактически приглашение оболочки уже существует, но прокручивается вверх). Вам не нужно нажимать [Enter], чтобы ввести следующую команду!

Второй пример (exec ... &) не имеет никакого смысла: амперсанд дает команду оболочке запустить команду как параллельный фоновый процесс, тогда как exec указывает оболочке вообще не запускать новый процесс и выполнять новую команду " переработка "текущий процесс. Говоря технически (очень упрощенно): код программы оболочки будет заменен кодом вызываемой программы.

Заключение:

  • Вам не нужно нажимать [Enter] (но это не причинит вреда)

  • Так как скрипт оболочки запускается как параллельная задача, амперсанд может быть опущен.

  • Использовать exec абсолютно логично, если команда, которая должна быть запущена, является последней из выполняемых скриптом в любом случае, поэтому жертва командной консоли спасает один бесполезный в противном случае процесс.

[добавлено:] Просто одна вещь пришла в голову, почему вы можете подумать, что вы должны нажать [Enter]:

Пока процесс оболочки отображает командную строку (в ожидании вашей следующей команды), уведомление о завершенных фоновых процессах вообще не будет.

Вы получите уведомление только тогда, когда оболочка отобразит следующую командную строку. Это также может привести к иллюзии, что «нужно нажать [Enter], чтобы позволить завершить фоновый процесс».

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .