exec: замена процесса без создания дочернего
Обычно при запуске команды Bash создаёт новый процесс:
sleep 60
После завершения sleep управление возвращается обратно в shell.
Но exec работает иначе - он заменяет текущий процесс новым. Старый процесс исчезает, а его PID сохраняется.
▪️Простой пример
echo $$
exec sleep 60
После выполнения вы больше не вернётесь в текущий shell. Процесс Bash будет полностью заменён на sleep.
▪️Почему PID не меняется
Запустим:
echo $$
exec bash
И снова:
echo $$
PID останется тем же. Новый экземпляр Bash не был создан - текущий процесс просто заменился.
▪️Где это действительно полезно
Представьте простой launcher:
#!/bin/bash
echo "Starting application..."
exec /usr/local/bin/myapp
После запуска в системе не останется лишнего процесса Bash - только myapp.
Это особенно важно для:
контейнеров Docker;
systemd-сервисов;
entrypoint-скриптов.
▪️Почему это лучше обычного запуска
Без exec:
bash
└── myapp
С exec:
myapp
Нет промежуточного процесса, сигналы (SIGTERM, SIGINT) сразу получает приложение, а не оболочка.
▪️Когда использовать нельзя
После exec текущий скрипт прекращает существование:
echo "Before"
exec sleep 5
echo "After"
Строка After никогда не выполнится.
▪️Почему это важно
Многие воспринимают exec как ещё один способ запуска команды. На самом деле это механизм замены процесса. Он позволяет убрать лишний уровень в дереве процессов, избежать проблем с обработкой сигналов и сделать запуск сервисов более предсказуемым.
BashTex 📱 #bash #linux
Обычно при запуске команды Bash создаёт новый процесс:
sleep 60
После завершения sleep управление возвращается обратно в shell.
Но exec работает иначе - он заменяет текущий процесс новым. Старый процесс исчезает, а его PID сохраняется.
▪️Простой пример
echo $$
exec sleep 60
После выполнения вы больше не вернётесь в текущий shell. Процесс Bash будет полностью заменён на sleep.
▪️Почему PID не меняется
Запустим:
echo $$
exec bash
И снова:
echo $$
PID останется тем же. Новый экземпляр Bash не был создан - текущий процесс просто заменился.
▪️Где это действительно полезно
Представьте простой launcher:
#!/bin/bash
echo "Starting application..."
exec /usr/local/bin/myapp
После запуска в системе не останется лишнего процесса Bash - только myapp.
Это особенно важно для:
контейнеров Docker;
systemd-сервисов;
entrypoint-скриптов.
▪️Почему это лучше обычного запуска
Без exec:
bash
└── myapp
С exec:
myapp
Нет промежуточного процесса, сигналы (SIGTERM, SIGINT) сразу получает приложение, а не оболочка.
▪️Когда использовать нельзя
После exec текущий скрипт прекращает существование:
echo "Before"
exec sleep 5
echo "After"
Строка After никогда не выполнится.
▪️Почему это важно
Многие воспринимают exec как ещё один способ запуска команды. На самом деле это механизм замены процесса. Он позволяет убрать лишний уровень в дереве процессов, избежать проблем с обработкой сигналов и сделать запуск сервисов более предсказуемым.
BashTex 📱 #bash #linux