Я хочу запустить три программы (2x streamlit, 1x python) в фоновом режиме с помощью сценария оболочки:
#!/bin/sh
cd /Users/mc/src/crypto/ || exit
streamlit run dashboard.py &
streamlit run dashboard_basis_viewer.py &
/Users/mc/.virtualenvs/crypto/bin/python basis_calculator.py &
Этот скрипт работает (т.е. программы запускаются нормально), но есть две проблемы:
jobs
командойЕсли я запускаю последние 3 строки вручную из командной строки, у меня не возникает ни одной из этих проблем. Что тут происходит? Как я могу это исправить?
У вас есть процесс, запускающий оболочку. Основываясь на информации, указанной в опубликованном вопросе, делается предположение, что это zsh
, но возможны и другие. Когда опубликованный скрипт выполняется, создается новый процесс для запуска скрипта в файле /bin/sh
. Этот новый процесс запускает три новых фоновых задания, связанных с /bin/sh
. Затем /bin/sh
завершается, оставляя три задания в виде осиротевших процессов. Таким образом, при jobs
вводе команды эти три задания не появляются, потому что три теперь осиротевших процесса никогда не были заданиями исходного файла zsh
. Более того, при zsh
завершении трем заданиям не посылаются никакие сигналы типа завершения, поскольку процессы являются осиротевшими.
Если необходимо, чтобы при jobs
вводе команды отображались три задания, то перед путем и именем сценария может стоять команда .
или . source
Скрипт будет выполняться в текущем zsh
и поэтому первая строка в размещенном скрипте будет проигнорирована. Например, если имя сценария есть myscript
и находится в текущем рабочем каталоге, то можно ввести одно из следующего.
. ./myscript
source ./myscript
Если нет необходимости, чтобы три задания появлялись при jobs
вводе команды, тогда строка, содержащая wait
команду, может быть добавлена к опубликованному сценарию. Это предотвратит создание сирот, когда для выполнения сценария в фоновом режиме используется следующее.
./myscript &
Наконец, от идеи сценария можно отказаться в пользу функции. Ниже приведен пример.
myfunction()
{
local "cwd=$(pwd)"
cd /Users/mc/src/crypto/
local "n=$?"
if [[ n -eq 0 ]]; then
streamlit run dashboard.py &
streamlit run dashboard_basis_viewer.py &
/Users/mc/.virtualenvs/crypto/bin/python basis_calculator.py &
n="$?"
fi
cd "$cwd"
return "$n"
}
.
имеет source
тот же результат... но только большую часть времени, по крайней мере, в моей системе по моему опыту. Если я пытаюсь получить сценарий, используя .
псевдоним из подоболочки в другом сценарии, это не удается. source
Работает только команда. Я всегда предполагал, что это произошло из-за того, что псевдоним не был установлен в глобальной области видимости, а подоболочка не загружала мой .bash_profile/.bashrc/etc.. но, читая ваш ответ, меня осенило, что я только что предполагал что все эти годы. Я близко?
без холма
мчангун
jobs
, и эти процессы должны быть убиты, если я выйду из терминала. Это поведение, если бы я запускал процессы в командной строке, а не из сценария.без холма
jobs
не показывает фоновые процессы, запущенные из сценариев (только те, которые вы запустили в интерактивном режиме в текущей оболочке).Дэвид Андерсон
./myscript
попробуйтеsource ./myscript
или. ./myscript
.