TGViewer
LinuxSkill - Сводки с прода и Шпаргалки LinuxSkill - Сводки с прода и Шпаргалки @linuxskill · 10.7K subscribers
Post #1210 1.65K
Попалась заметка про reptyr — утилиту, которая забирает уже запущенный процесс в новую сессию терминала. Команды из ходовых инструкций прогнал сам, на двух машинах с Ubuntu 24.04.

Ситуация: запустил в ssh дамп базы, а он затянулся. Надо было сразу в tmux, но уже поздно.

Сначала отвязываем процесс от текущей оболочки:

# Ctrl-Z, потом
bg
jobs -l
disown %1



Вот тут первая шероховатость. В инструкциях пишут disown top, по имени команды. Оно работает, но ровно пока такой job один. Проверил: один sleep снимается нормально, два — ambiguous job spec и выход с кодом 1. Пиши %1 или PID, не имя.

Дальше открываем новую сессию в tmux и забираем процесс:

# PID берём из вывода jobs -l
reptyr 7972


Работает. Прогнал на top из одной tmux-сессии в другую: нулевой дескриптор сменился с /dev/pts/0 на /dev/pts/2, вывод продолжился в новом окне.

При этом reptyr напечатал [-] Timed out waiting for child stop. — и всё равно перенёс. Причём это вылезло на обеих машинах и на разных версиях, так что предупреждение можно игнорировать.

А вот чего в инструкциях обычно нет. По умолчанию в Debian и Ubuntu kernel.yama.ptrace_scope равен 1: подцепиться можно только к своему потомку. Процесс из старой ssh-сессии новой оболочке не потомок.

Запустил от обычного пользователя — получил отказ:

Unable to attach to pid 2162:
Operation not permitted


Дальше reptyr сам подсказывает посмотреть ptrace_scope — за это спасибо автору. Лечится так:

cat /proc/sys/kernel/yama/ptrace_scope

# 0 — классические правила ptrace
sysctl -w kernel.yama.ptrace_scope=0



С нулём тот же скрипт перенёс процесс на /dev/pts/5. Но это ослабление защиты: любой процесс под тем же uid сможет подцепиться к любому другому. Держать так постоянно на боевой машине я бы не стал. Под root, кстати, всё работает и при единице — CAP_SYS_PTRACE обходит yama.

Есть флаг -T: крадёт весь терминальный сеанс и по описанию должен выручать, когда у процесса есть дети. Взял конвейер sleep 400 | cat, натравил reptyr -T — и ничего. Ни ошибки, ни переноса: лог пустой, tty прежний. В чём подвох, не разобрался.

И про версии. На одной машине приехал reptyr 0.9.0-1, на другой при той же Ubuntu 24.04 — 0.8.0. Флаги в обеих одинаковые, но длинных опций нет ни там, ни там: reptyr --help отвечает invalid option.

А вы reptyr вообще применяли в бою или проще перезапустить и не рисковать?

#Linux #Bash #tmux #reptyr #DevOps
  • 👍 2
  • 🔥 1
More from @linuxskill
  1. Oct 2, 2026📊 Диск тормозит, а iostat показывает норму? Ищем хвост задержек Приложение подвисает на з…
  2. Sep 30, 2026💀 CPU под 100%, а в top пусто? Ловим невидимые процессы через eBPF Сервер греется, в шапк…
  3. Sep 28, 2026🔥 Знаешь только ip a? 10 неочевидных команд ip для Linux Большинство админов знают про ip…
  4. Sep 25, 2026Разобрать строку штатным <regex.h> и не получить молчаливое «нет совпадения». Проверял на…
  5. Sep 23, 2026Закрыть периметр правилами iptables и не остаться при этом за дверью вместе с атакующим. П…
  6. Sep 21, 2026Добавить пользователя в группу и не выкинуть его при этом из sudo Добавить во вторичную гр…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →