Сохраняем и восстанавливаем окружение
Со временем окружение обрастает алиасами, функциями, переменными, путями - целой экосистемой, которую легко потерять при переключении между проектами. Что если сделать снимок текущего состояния shell и потом восстановить его одной командой?
1️⃣ Сохранение окружения. Bash позволяет получить всю информацию о текущем состоянии:
Можно собрать это в файл:
Теперь у вас дамп окружения. Содержит все, что вы настроили вручную или подгрузили через .bashrc, .bash_aliases, и т.д.
2️⃣ Восстановление окружения. Чтобы применить снимок в другой сессии:
Все ваши функции, алиасы и переменные возвращаются как были.
3️⃣ Пример автоматизации. Сделаем удобный скрипт:
Использование:
4️⃣ Сравнение. Финалочка, можно сравнить два снимка:
покажет, что отличается между dev и prod.
BashTex📱 #bash #utils
Со временем окружение обрастает алиасами, функциями, переменными, путями - целой экосистемой, которую легко потерять при переключении между проектами. Что если сделать снимок текущего состояния shell и потом восстановить его одной командой?
alias # все алиасы
declare -f # все функции
declare -p # все переменные (включая окружение)
Можно собрать это в файл:
{
echo "# Snapshot from $(date)"
echo "# Aliases"
alias
echo
echo "# Functions"
declare -f
echo
echo "# Variables"
declare -p
} > ~/.bash_snapshot
Теперь у вас дамп окружения. Содержит все, что вы настроили вручную или подгрузили через .bashrc, .bash_aliases, и т.д.
source ~/.bash_snapshot
Все ваши функции, алиасы и переменные возвращаются как были.
snapshot() {
local file="${1:-~/.bash_snapshot_$(date +%F_%H-%M-%S)}"
{
alias
declare -f
declare -p | grep -v '^declare -[a-z]* BASH'
} > "$file"
echo "Saved snapshot to $file"
}
restore() {
local file="${1:-~/.bash_snapshot_latest}"
[[ -f $file ]] && source "$file" && echo "Restored from $file"
}
Использование:
snapshot ~/envs/dev.env
restore ~/envs/dev.env
diff <(grep -v '^#' dev.env) <(grep -v '^#' prod.env)
покажет, что отличается между dev и prod.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Захват переменных окружения из другой сессии
Иногда нужно подцепить окружение работающего процесса: например, чтобы повторить его контекст, восстановить переменные или понять, с какими параметрами запущен сервис.
Обычно это делают через export или env, но можно достать переменные прямо из
▪️ Чтение окружения процесса. Каждый процесс в Linux хранит свои переменные в:
Это бинарный файл, где переменные разделены нулевыми байтами (\0).
Выведет все окружение процесса:
▪️ Захват и использование в текущей сессии. Если нужно подгрузить это окружение в текущий bash:
Теперь ты в том же окружении, что и процесс $PID.
▪️ Извлечение конкретной переменной. Например, достанем PATH:
А если нужно универсальнее, то функция:
▪️ Захват окружения systemd-сервисов. Systemd не всегда передает окружение дальше, но его можно вытащить по PID активного процесса:
Пример: повторить сессию nginx worker’а
Теперь любая команда (например, curl, python, php) будет запускаться с теми же переменными, что и процесс веб-сервера.
🌟 Доступно только для процессов, владельцем которых ты являешься (или root).
BashTex📱 #bash #utils
Иногда нужно подцепить окружение работающего процесса: например, чтобы повторить его контекст, восстановить переменные или понять, с какими параметрами запущен сервис.
Обычно это делают через export или env, но можно достать переменные прямо из
/proc, без доступа к shell-сессии.
/proc/<PID>/environ
Это бинарный файл, где переменные разделены нулевыми байтами (\0).
PID=1234
tr '\0' '\n' < /proc/$PID/environ
Выведет все окружение процесса:
USER=www-data
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
PWD=/var/www
HOME=/var/www
LANG=en_US.UTF-8
PID=1234
eval "$(tr '\0' '\n' < /proc/$PID/environ | sed 's/^/export /')"
Теперь ты в том же окружении, что и процесс $PID.
Будет полезно, если:
хочешь повторить окружение демона (nginx, systemd, custom app);
нужно пересоздать контекст для отладки;
запускаешь скрипт от того же пользователя, что и процесс.
grep -z '^PATH=' /proc/$PID/environ | tr -d '\0' | cut -d= -f2-
А если нужно универсальнее, то функция:
get_env_var() {
local pid=$1 var=$2
grep -z "^${var}=" /proc/$pid/environ | tr -d '\0' | cut -d= -f2-
}
get_env_var 1234 PATH
PID=$(systemctl show -p MainPID myservice | cut -d= -f2)
tr '\0' '\n' < /proc/$PID/environ
Пример: повторить сессию nginx worker’а
PID=$(pgrep -n nginx)
eval "$(tr '\0' '\n' < /proc/$PID/environ | sed 's/^/export /')"
env | grep -E 'PATH|LANG|PWD'
Теперь любая команда (например, curl, python, php) будет запускаться с теми же переменными, что и процесс веб-сервера.
BashTex
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3