BashTex | Linux
2.5K subscribers
44 photos
8 videos
276 links
Авторский канал для тех, кто хочет глубже погрузиться в мир Linux.

Подойдет для разработчиков, системных администраторов и DevOps

Реклама: @dad_admin
Download Telegram
Сохраняем и восстанавливаем окружение

Со временем окружение обрастает алиасами, функциями, переменными, путями - целой экосистемой, которую легко потерять при переключении между проектами. Что если сделать снимок текущего состояния shell и потом восстановить его одной командой?

1️⃣ Сохранение окружения. Bash позволяет получить всю информацию о текущем состоянии:


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, и т.д.

2️⃣ Восстановление окружения. Чтобы применить снимок в другой сессии:


source ~/.bash_snapshot


Все ваши функции, алиасы и переменные возвращаются как были.

3️⃣ Пример автоматизации. Сделаем удобный скрипт:


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


4️⃣ Сравнение. Финалочка, можно сравнить два снимка:


diff <(grep -v '^#' dev.env) <(grep -v '^#' prod.env)


покажет, что отличается между dev и prod.

BashTex 📱 #bash #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Захват переменных окружения из другой сессии

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

Обычно это делают через export или env, но можно достать переменные прямо из /proc, без доступа к shell-сессии.

▪️ Чтение окружения процесса. Каждый процесс в Linux хранит свои переменные в:


/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


▪️ Захват и использование в текущей сессии. Если нужно подгрузить это окружение в текущий bash:


PID=1234
eval "$(tr '\0' '\n' < /proc/$PID/environ | sed 's/^/export /')"


Теперь ты в том же окружении, что и процесс $PID.

Будет полезно, если:

хочешь повторить окружение демона (nginx, systemd, custom app);
нужно пересоздать контекст для отладки;
запускаешь скрипт от того же пользователя, что и процесс.


▪️ Извлечение конкретной переменной. Например, достанем PATH:


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


▪️ Захват окружения systemd-сервисов. Systemd не всегда передает окружение дальше, но его можно вытащить по PID активного процесса:


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) будет запускаться с теми же переменными, что и процесс веб-сервера.

🌟 Доступно только для процессов, владельцем которых ты являешься (или root).

BashTex 📱 #bash #utils
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3