Мне сложно понять, как процессы запускаются в таком сценарии оболочки.
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
что происходит, когда он запускается с &
Сначала создается подоболочка &
.
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. Когда это произойдет?
Тогда pid 48 останется, а другой pid будет запущен как команда 1.
Есть ли способ избежать сохранения 48 в качестве основного сценария и заменить его дочерним процессом? Я попробовал несколько вариантов, но не могу заменить подоболочку дочерним процессом.
Я не понимаю. Так что не заводите ребенка вообще. Ваш вопрос показывает, как его заменить - с помощью exec. А еще у вашего компьютера гигабайты памяти, кому нужен один процесс.
Извините, возможно, я не очень ясно выразился. Я запускаю их в докере и хочу, чтобы процессов было как можно меньше. Моя проблема в том, что мне нужно, чтобы команда 1 работала в фоновом режиме, а подоболочка (основной сценарий, работающий как 48) была заменена на команду 1.
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
это противоречие. Я до сих пор не слежу, именно это и происходит в вашем вопросе.
если вы добавите амперсанд к своей команде,
exec
больше не будет иметь эффекта! Задание выполняется в фоновом режиме. Ты мог бы получить его код$!
!