В качестве описанной вами оболочки можно использовать следующий сценарий. Он сохраняет стандартный вывод и стандартные потоки ошибок данной команды в каталог состояния ($HOME/states
), а также сохраняет количество неудачных запусков.
Если количество неудачных запусков команды превышает 10 (или любое другое число, заданное для флага командной строки -t
), он выдаст некоторый вывод (в свой стандартный поток ошибок ).. Во всех остальных случаях вывод не производится. Сценарий завершается с тем же статусом выхода, что и данная команда.
Пример использования:
$ sh./script.sh -t 2 sh -c 'echo "this will fail"; cd /nowhere'
$ sh./script.sh -t 2 sh -c 'echo "this will fail"; cd /nowhere'
FAILED 2 times: sh -c echo "this will fail"; cd /nowhere
f88eff95bba49f6dd35a2e5ba744718d
stdout --------------------
this will fail
stderr --------------------
sh: cd: /nowhere - No such file or directory
END
Сам скрипт (опирается на md5sum
из GNU coreutils):
#!/bin/sh
statedir="$HOME/states"
if ! mkdir -p "$statedir"; then
printf 'Failed creating "%s"\n' "$statedir" >&2
exit 1
fi
max_tries=10
while getopts 't:' opt; do
case "$opt" in
t) max_tries=$OPTARG ;;
*) echo 'error' >&2
exit 1
esac
done
shift "$(( OPTIND - 1 ))"
hash=$( printf '%s\n' "$@" | md5sum | cut -d ' ' -f 1 )
"$@" >"$statedir/$hash".out 2>"$statedir/$hash".err
code=$?
if [ -f "$statedir/$hash" ]; then
read tries <"$statedir/$hash"
else
tries=0
fi
if [ "$code" -eq 0 ]; then
echo 0 >"$statedir/$hash"
exit 0
fi
tries=$(( tries + 1 ))
printf '%d\n' "$tries" >"$statedir/$hash"
if [ "$tries" -ge "$max_tries" ]; then
cat >&2 <<END_MESSAGE
FAILED $tries times: $@
stdout --------------------
$(cat "$statedir/$hash".out)
stderr --------------------
$(cat "$statedir/$hash".err)
END
END_MESSAGE
fi
exit "$code"
Может различаться в зависимости от архитектуры, для x86/x86 -64 она есть.
Нет
Все :текст, данные, BSS и др. Это не означает, что выделяется какая-либо физическая память. Иногда он лениво выделяется в ОЗУ, иногда он сопоставляется с оборудованием, иногда сопоставляется с вычислением.
Каждый процесс получает столько виртуального адресного пространства, сколько ему нужно, вплоть до максимума, зависящего от архитектуры -и конфигурации -. Объем выделенной памяти можно настроить с помощью brk
,sbrk
и mmap
.
Максимум, доступный для x86 -64, в настоящее время составляет 128 ТиБ с четырьмя таблицами страниц уровня -, 64 ПиБ с пятью таблицами страниц уровня -. На 32 -бит x86 максимальное доступное значение зависит от конфигурации разделения ВМ ; он варьируется от 1 ГиБ до 3 ГиБ на процесс.
№
Адресное пространство для каждого процесса содержит все, что процессу может потребоваться для доступа в памяти. Адресное пространство может быть выделено без отображения на физическую память.