Несколько команд exec, выполняемых в фоновом режиме в сценарии оболочки

Мне сложно понять, как процессы запускаются в таком сценарии оболочки.

mainscript.sh

exec command1 &
sleep 10
exec command2 &
sleep 10

Я понимаю, что команда exec не создает новый процесс, она просто заменяет bash командой, которую нужно выполнить, в этом случае, что происходит, когда она запускается с &

В настоящее время я вижу, что это вывод ps примерно так

UID      PID   PPID  C STIME TTY          TIME CMD
user+    1       0  0 16:43 ?        00:00:00 bash mainscript.sh
user+    48      1  9 16:43 ?        00:00:04 command1
user+    133     1  0 16:43 ?        00:00:00 command2

если вы добавите амперсанд к своей команде, exec больше не будет иметь эффекта! Задание выполняется в фоновом режиме. Ты мог бы получить его код $!!

F. Hauri - Give Up GitHub 05.05.2024 19:17
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
73
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

что происходит, когда он запускается с &

Сначала создается подоболочка &.

user+    1       0  0 16:43 ?        00:00:00 bash mainscript.sh
user+    48      1  9 16:43 ?        00:00:04 bash mainscript.sh

Затем эта подоболочка заменяется на command1.

user+    1       0  0 16:43 ?        00:00:00 bash mainscript.sh
user+    48      1  9 16:43 ?        00:00:04 command1

Вся строка, включая exec, выполняется в подоболочке.

Примечание: без exec в этом случае вы, скорее всего, увидите тот же результат. Это связано с тем, что в Bash есть оптимизация: если (под)оболочка будет выполнять только один процесс (и есть еще некоторые условия), то Bash будет exec автоматически экономить ресурсы и уменьшать количество процессов в системе.

В моем случае PID 48 остается основным сценарием, а затем создается дочерний процесс для команды1. Когда это произойдет?

swamoch 07.05.2024 06:35

Тогда pid 48 останется, а другой pid будет запущен как команда 1.

KamilCuk 07.05.2024 09:33

Есть ли способ избежать сохранения 48 в качестве основного сценария и заменить его дочерним процессом? Я попробовал несколько вариантов, но не могу заменить подоболочку дочерним процессом.

swamoch 09.05.2024 19:02

Я не понимаю. Так что не заводите ребенка вообще. Ваш вопрос показывает, как его заменить - с помощью exec. А еще у вашего компьютера гигабайты памяти, кому нужен один процесс.

KamilCuk 10.05.2024 00:35

Извините, возможно, я не очень ясно выразился. Я запускаю их в докере и хочу, чтобы процессов было как можно меньше. Моя проблема в том, что мне нужно, чтобы команда 1 работала в фоновом режиме, а подоболочка (основной сценарий, работающий как 48) была заменена на команду 1.

swamoch 10.05.2024 06:39
I'm running these in a docker именно так, кого волнует один процесс. Docker запускает десятки процессов только для того, чтобы настроить себя. Я хочу сказать, что оптимизация единичного количества процессов довольно неэффективна. I need command1 to run in the background, and have the subshell (mainscript running as 48) be replaced by command1 это противоречие. Я до сих пор не слежу, именно это и происходит в вашем вопросе.
KamilCuk 10.05.2024 11:27

Другие вопросы по теме