Учтите это из документации встроенного в Bash exec:
exec заменяет оболочку без создания нового процесса
Пожалуйста, предоставьте пример использования / практический пример. Я не понимаю, как это имеет смысл.
Я гуглил и нашел про перенаправление ввода / вывода . Вы можете объяснить это лучше?
bash
shell-script
exec
shell-builtin
Иванов
источник
источник
Ответы:
exec
часто используется в сценариях оболочки, которые в основном действуют как оболочки для запуска других двоичных файлов. Например:так что после завершения работы оболочки «настоящий» двоичный файл вступает во владение, и больше не остается никаких следов сценария оболочки, который временно занимал тот же слот в таблице процессов. «Настоящий» двоичный файл является прямым потомком того, что его запустило вместо внука.
Вы также упоминаете перенаправление ввода / вывода в своем вопросе. Это совсем другой случай использования
exec
и не имеет ничего общего с заменой оболочки другим процессом. Когдаexec
не имеет аргументов, вот так:затем перенаправления ввода / вывода в командной строке вступают в силу в текущем процессе оболочки, но текущий процесс оболочки продолжает работать и переходит к следующей команде в сценарии.
источник
exec
говорит оболочке не выполнять действие (выполнить команду или выполнить перенаправление) в дочернем процессе, но в одном и том же процессе.Я использовал
exec
встроенную оболочку, чтобы получить идентификатор процесса (PID) для Java-программы. Возможно, сейчас есть способ получить PID изнутри Java, но несколько лет назад его не было. Как только у процесса есть свой собственный PID, он может записать его в файл PID (искать/var/run/
имена файлов с суффиксом «.pid»), чтобы позволить управляющим программам узнать PID запущенного процесса и предотвратить второй экземпляр. того же сервера от запуска. Это работает примерно так:Код в
main()
методе классаStartClass
обрабатывает разбор аргументов и может найти свой собственный идентификатор процесса.источник
Для удовольствия запустите следующую программу (переведенную на выбранный язык реализации) в фоновом режиме в системе с учетом и ограничением пользовательских процессов.
Теперь, когда каждый слот в таблице процессов, который вам разрешено использовать, заполнен копиями этой запущенной программы, как вы собираетесь его убить? Для запуска kill (1) требуется еще один слот процесса, которого у вас нет. Конечно, было бы удобно, чтобы оболочка заменила себя командой kill ...
(Предполагается, что ваша система имеет kill (1) в / bin / kill. "Exec` which kill` -9 -1 "потенциально безопаснее.) Это отправляет SIGKILL каждому процессу, который вы можете.
(Примечание: не выходите из своей запускающей оболочки, если ограничения процесса не всегда разрешают новый вход в слот процесса для его оболочки. Это может быть немного сложнее очистить, если вы это сделаете. Я, конечно, не делал этого в начало 90-х. Нет.)
источник
exec
команду, которая будет полезна в этой ситуации. (2) Этот ответ несколько архаичен;kill
команда была команда в Баш встроенная команда на протяжении многих лет, в основном из -за этой проблемы.exec
- и тот факт, чтоkill
встроенная функция на самом деле не имеет ничего общего соexec
встроенной функцией.`which kill`
) также не будет работать. (2) Кстати,$(…)
форма рекомендуется над`…`
формой. (3) Но нет ничего опасного в догадках по каталогу. Если вы случайно напечатаетеexec /binn/kill
, вы просто получите сообщение об ошибке, и ваша оболочка не исчезнет. (4) Но вы даже не нужно беспокоиться о том , что каталогkill
находится в.exec
Использует$PATH
, так же , как обычные команды, поэтомуexec kill …
работает (если у вас есть/bin
в вашем пути поиска).Это похоже на пример Брюса о необходимости знать PID процесса:
в котором ты
(
и)
),$$
даст вам PID основной оболочки.)Это будет выполняться
long-running-command
, но только в течение заранее определенного, ограниченного периода времени.Это немного несерьезно, но, если вы решите, что хотите быть суперпользователем (или другим пользователем) до конца сеанса входа в систему, вы можете это сделать
exec su
.На самом деле, я могу представить сценарий, где это было бы действительно полезно. Предположим, что вы вошли в удаленную систему, и по какой-то причине возникла проблема с разрывом соединения и установлением нового соединения. Например, предположим, что удаленная система имеет брандмауэр, который следует расписанию. Вам было разрешено подключиться, когда вы это сделали, и установленные подключения не закрываются, но в настоящее время новые подключения не принимаются.
Вы сделали то, что хотели, и готовы выйти из системы. Ваш друг Боб находится в комнате с вами, и он хочет сделать некоторую работу с удаленной системой - но он не сможет подключиться. Итак, вы печатаете
exec su - bob
и, когда появляется запрос пароля, передаете рабочую станцию ему. Теперь нет никакого процесса с вашим UID (если вы не запустили что-то в фоновом режиме), поэтому Боб не сможет возиться с вашими файлами. Он будет эффективно завладеть вашей связью (с вашего согласия и сотрудничества).Примечания:
su
.who
вероятно все равно покажет ваше имя. Вполне возможно, что некоторые (плохо написанные) программы будут использовать это, чтобы думать, что Боб - это вы, и дать ему доступ к вашим ресурсам.источник
(a;b)
уже используется то же самое, что и(a;exec b)
в оболочках, которые оптимизируют разветвление для последней команды в подоболочке. Единственные исключения, кажется,bash
иmksh
. Использованиеexec
помогает гарантировать это.