Я случайно переписал очень сложный сценарий bash, в котором я попытался аккуратно реализовать область видимости и потоки.
Теперь тот же сценарий все еще выполняется, но файла больше нет, вопрос: можно ли сканировать через оперативную память и найти строковое представление самого файла?
Другая проблема: я не могу найти файл / dev / mem или / dev / kmem, уже пытался найти его для поиска.
К среде: это хост машины Debian / sid (vps) на vpsfx.com
root @ heisenberg: ~ # ls -a / dev , kmsg ptyp2 ptyp9 случайный tty1 tty5 ttyp2 ttyp9 urandom .. журнал ptyp3 ptypa shm tty10 tty6 ttyp3 ttypa xconsole .udev null ptyp4 ptypb stderr tty11 tty7 ttyp4 ttypb ноль char ptmx ptyp5 ptypc stdin tty12 tty8 ttyp5 ttypc консоль pts ptyp6 ptypd stdout tty2 tty9 ttyp6 ttypd fd ptyp0 ptyp7 ptype tty tty3 ttyp0 ttyp7 ttype полный ptyp1 ptyp8 ptypf tty0 tty4 ttyp1 ttyp8 ttypf
/proc
фс не находится в оперативной памяти. На самом деле, он не находится в любом месте . См. Unix.stackexchange.com/questions/74713/… . Несмотря на то, что вы можете получить fd от/proc
,cat
fd читает файл из fs, а не из RAM. Правда, вы удалили файл, сократив количество ссылок на узлы, и теперь никто не может его увидеть, но он фактически не удаляется из fs, пока процесс, выполняющий скрипт, не закроет его. См. Stackoverflow.com/questions/2028874/… .Если предположить, что OP действительно имел в виду оперативную память, а не каким-либо возможным способом , и предположить, что процесс, в котором выполнялся сценарий, имеет нулевое ограничение файла ядра (что обычно является настройкой по умолчанию
cat /proc/PID/limits
), то вам необходимо присоединиться к процессу и либо установите ограничение ядра на достаточно большое значение, чтобы включить образ процесса и использовать сигнал ABRT для генерации файла ядра, или использовать такой инструмент,gdb
который может подключаться к процессу и генерировать образ ядра процесса из ОЗУ.gdb
В некоторых оболочках с тем же владельцем, что и у запущенного скрипта или владельца root:
ps ax
найти идентификатор процесса (PID)gdb -p PID
Обратите внимание, что это остановит выполнение процесса от продолжения, но не удалит его из таблицы процессов.
generate-core-file
GDB должен ответить с чем-то вроде
Saved corefile core.15113
, предполагая, что PID 15113.detach
Ваш скрипт будет продолжать (возобновлять) работу.
quit
strings core.15113 > my_script.sh
Откройте
my_script.sh
в каком-то редакторе. Текст вашего скрипта должен быть ближе к концу файла перед разделом среды. Используйте редактор, чтобы соскрести разделы до и после сценария.Протестируйте это решение на другом скрипте, прежде чем использовать его в своем призовом скрипте. YMMV.
Последовательность выглядит так:
источник
dd раздел жесткого диска в перекрывающихся чанках и бинарный файл grep для частей скрипта. если вам повезет, запишите эти куски во временную директорию в оперативной памяти, чтобы они появились в ней, чтобы сохранить цикл записи жесткого диска или ssd. нет, это не решение "от оперативной памяти". помните о том, что при чтении байтовых скриптов на диске может использоваться формат кодировки utf-8 (или аналогичный), поэтому параметры grep также могут быть адаптированы.
источник