Иногда нужно подцепить окружение работающего процесса: например, чтобы повторить его контекст, восстановить переменные или понять, с какими параметрами запущен сервис.
Обычно это делают через 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