Создать новую оболочку bash из сценария .sh

У меня сложилось впечатление, что у вас есть несколько неверных представлений о tmpfs. Возможно, вам будет полезно прочитать документацию по ядру по этой теме; Я попытаюсь прояснить для вас некоторые вещи здесь.

Заголовок вашего вопроса «tmpfs не переполняется для свопинга», похоже, не отражает фактического содержания вашего вопроса, но в любом случае tmpfs действительно использует своп, хотя, возможно, он не переполняется для обмена. tmpfs — это (виртуальная) файловая система в памяти; его содержимое живет только в памяти, но, поскольку оно может быть заменено, ядро ​​может при необходимости сохранить его в свопе вместо физической памяти. Тем не менее файловые системы tmpfs не могут быть больше общего объема доступной виртуальной памяти, т.е. физическая оперативная память и подкачка, как указано например. по бесплатно -h.

По умолчанию файловые системы tmpfs имеют максимальный размер, равный половине объема доступной физической памяти. Вы можете увеличить его, используя параметр size, но опять же, он не может быть больше, чем доступная физическая память и подкачка (хотя это ограничение не применяется во время монтирования). Как только файловая система достигает своего максимального размера (точнее, содержит файлы, занимающие столько места), она сообщает, что ей не хватает места, как вы выяснили. tmpfs сам по себе не поддерживает переполнение в любом месте, когда ему не хватает места.

Если вам нужно временное место для хранения больших файлов, используйте /var/tmp, а не /tmp. Вам действительно не нужна очень большая tmpfs файловая система, это прямой путь к катастрофе, когда она переполняется (обычные способы восстановления памяти ядра не работают в tmpfs) .

(Конечно, если у вас много ОЗУ, большой tmpfs может работать. Я запускаю несколько систем со сборкой файловых систем tmpfs размером 75% ОЗУ, из 32 ГБ, 64 ГБ или даже больше.)

0
28.05.2019, 00:08
1 ответ

Скрипт decrypt.sh:

#!/bin/bash

# Create working directory.
tmpdir=$(mktemp -d)

# Remove the temporary directory upon exiting
trap 'rm -r "$tmpdir"' EXIT

# Copy "encrypt.sh" from somewhere.
cp /somewhere/encrypt.sh "$tmpdir"

# Start an interactive shell in the directory with
# HISTFILE set to /dev/null
( cd "$tmpdir" && HISTFILE=/dev/null bash )

Скрипт encrypt.sh:

#!/bin/bash

# When exiting, terminate the parent shell
trap 'kill -s HUP "$PPID"' EXIT

# rest of script goes here

Скрипт decrypt.shотвечает за настройку рабочего каталога и его удаление. Настройка каталога включает его создание (с использованием mktemp -dдля создания временного каталога )и копирование в него скрипта encrypt.shиз любого места, где может находиться оригинал. Удаление рабочего каталога происходит, когда скрипт decrypt.shзавершает работу.

Сценарий encrypt.shзавершит свою родительскую оболочку при выходе из нее, отправив ему сигнал HUP, предлагающий сценарию decrypt.shудалить рабочий каталог. Каталог также будет удален, если пользователь выйдет из интерактивной оболочки, не запустив encrypt.sh.


Вместо того, чтобы устанавливать HISTFILEна /dev/nullили пытаться сбросить его в созданной интерактивной оболочке, вы можете просто установить HOMEна временный каталог. Файл истории будет создан под $HOMEи будет удален вместе с каталогом, когда decrypt.shвыйдет из :

.
( cd "$tmpdir" && HOME="$tmpdir" bash )

Обратите внимание, что это влияет на поведение раскрытия тильды и cdбез аргумента и всего остального, что может использовать переменную HOME.

Менее инвазивный вариант — явно установить для переменной HISTFILEимя файла во временном каталоге:

( cd "$tmpdir" && HISTFILE="$tmpdir/.bash_history" bash )

Немного похоже :Инструмент, который использует некоторые из этих вещей (создает интерактивную оболочку во временном рабочем каталоге в чистой среде с очисткой -при выходе из оболочки):

Отказ от ответственности :Это я написал.

3
28.01.2020, 02:22

Теги

Похожие вопросы