Система
Модуль System предоставляет функции, которые взаимодействуют напрямую с виртуальной машиной (ВМ) или системой-хостом.
Время
Модуль System также предоставляет функции работы со временем, возвращая различные временные метки, поддерживающие различные единицы измерения времени.
Одна из сложностей при использовании системного времени заключается в том, что оно может корректироваться. Например, при переходе на летнее или зимнее время, системные часы корректируются, часто добавляя или удаляя один час. Такие изменения называются "временными скачками". Для понимания того, как такие изменения могут быть вредными, рассмотрим следующий код:
## DO NOT DO THIS prev = System.os_time() # ... execute some code ... next = System.os_time() diff = next - prev
Если во время выполнения кода системные часы меняются, некоторые фрагменты кода, выполнявшиеся в течение 1 секунды, могут быть отчитаны как выполнявшиеся более часа! Для решения подобных проблем ВМ предоставляет монотонное время через System.monotonic_time/0, которое никогда не уменьшается и не изменяется скачкообразно:
## DO THIS prev = System.monotonic_time() # ... execute some code ... next = System.monotonic_time() diff = next - prev
В целом, ВМ предоставляет три измерения времени:
os_time/0- время, сообщенное операционной системой (ОС). Это время может корректироваться вперёд или назад без ограничений;system_time/0- представление ВМ оos_time/0. Системное время и время операционной системы могут не совпадать в случае временных скачков, хотя ВМ стремится их согласовать. Это время не является монотонным (т.е. может уменьшаться), так как его поведение настраивается режимом временных скачков ВМ;monotonic_time/0- монотонно возрастающее время, предоставляемое виртуальной машиной Erlang.
Функции времени в этом модуле работают в :native единицах (если не указано иное), которые зависят от операционной системы. В большинстве случаев все вычисления выполняются в :native единицах, чтобы избежать потери точности, с вызовом convert_time_unit/3 в конце для преобразования в конкретную единицу времени, такую как :millisecond или :microsecond. Подробнее см. тип time_unit/0.
Для более полного обзора поддержки ВМ различных временных измерений, см. главу о времени и коррекции времени в документации Erlang.
Краткое описание
Типы
- time_unit()
Единица измерения времени, передаваемая функциям, таким как
monotonic_time/1и другим.
Функции
- argv()
Отображает аргументы командной строки.
- argv(args)
Изменяет аргументы командной строки.
- at_exit(fun)
Регистрирует функцию обработчика завершения программы.
- build_info()
Информация о сборке Elixir.
- cmd(command, args, opts \\ [])
Выполняет данную
commandсargs.- compiled_endianness()
Возвращает порядок байтов, с которым была скомпилирована система.
- convert_time_unit(time, from_unit, to_unit)
Преобразует
timeиз единицы измерения времениfrom_unitв единицу измерения времениto_unit.- cwd() устаревшее
Текущая рабочая директория.
- cwd!() устаревшее
Текущая рабочая директория, исключение при ошибке.
- delete_env(varname)
Удаляет переменную окружения.
- endianness()
Возвращает порядок байтов.
- fetch_env(varname)
Возвращает значение заданной переменной окружения или
:error, если она не найдена.- fetch_env!(varname)
Возвращает значение заданной переменной окружения или вызывает исключение, если она не найдена.
- find_executable(program)
Находит исполняемый файл в системе.
- get_env()
Возвращает все переменные окружения системы.
- get_env(varname, default \\ nil)
Возвращает значение заданной переменной окружения.
- get_pid() устаревшее
Идентификатор процесса Erlang VM.
- halt(status \\ 0)
Немедленно останавливает систему Erlang.
- monotonic_time()
Возвращает текущее монотонное время в единицах измерения
:native.- monotonic_time(unit)
Возвращает текущее монотонное время в заданной единице измерения времени.
- no_halt()
Проверяет, будет ли система остановлена после обработки ARGV.
- no_halt(boolean)
Указывает, должна ли система остановиться после обработки ARGV.
- os_time()
Возвращает текущее время операционной системы.
- os_time(unit)
Возвращает текущее время операционной системы в заданной единице измерения
unit.- otp_release()
Возвращает номер версии Erlang/OTP.
- pid()
Возвращает PID операционной системы для текущего экземпляра системы Erlang.
- put_env(enum)
Устанавливает несколько переменных окружения.
- put_env(varname, value)
Устанавливает значение переменной окружения.
- restart()
Перезапускает все приложения в системе Erlang.
- schedulers()
Возвращает количество планировщиков в VM.
- schedulers_online()
Возвращает количество активных планировщиков в VM.
- stacktrace()
Устаревший механизм получения последнего стека исключений.
- stop(status \\ 0)
Осторожно останавливает систему Erlang.
- system_time()
Возвращает текущее системное время в единицах измерения
:native.- system_time(unit)
Возвращает текущее системное время в заданной единице измерения времени.
- time_offset()
Возвращает текущую разницу во времени между монотонным временем VM Erlang и системным временем VM Erlang.
- time_offset(unit)
Возвращает текущую разницу во времени между монотонным временем VM Erlang и системным временем VM Erlang.
- tmp_dir()
Директория временных файлов.
- tmp_dir!()
Директория временных файлов, исключение при ошибке.
- unique_integer(modifiers \\ [])
Генерирует и возвращает уникальное целое число в текущем экземпляре среды выполнения.
- user_home()
Директория домашней папки пользователя.
- user_home!()
Директория домашней папки пользователя, исключение при ошибке.
- version()
Информация о версии Elixir.
Типы
time_unit()
Specs
time_unit() :: :second | :millisecond | :microsecond | :nanosecond | pos_integer()
Единица измерения времени, передаваемая функциям, таким как monotonic_time/1 и другим.
Единицы измерения времени :second, :millisecond, :microsecond и :nanosecond управляют значением возвращаемого функциями, принимающими единицу измерения времени.
Единицей измерения времени также может быть строго положительное целое число. В этом случае она представляет «части в секунду»: время будет возвращено в 1 / parts_per_second секунды. Например, использование единицы измерения :millisecond эквивалентно использованию 1000 (так как время будет возвращено в 1/1000 секунды — миллисекунды).
Функции
argv()
Характеристики
argv() :: [String.t()]
Выводит аргументы командной строки.
Возвращает список аргументов командной строки, переданных программе.
argv(args)
Характеристики
argv([String.t()]) :: :ok
Изменяет аргументы командной строки.
Изменяет список аргументов командной строки. Используйте с осторожностью, так как это уничтожает любые предыдущие данные argv.
at_exit(fun)
Характеристики
at_exit((non_neg_integer() -> any())) :: :ok
Регистрирует функцию обработчика завершения программы.
Регистрирует функцию, которая будет вызвана в конце выполнения программы. Полезно для вызова хука в режиме «скрипт».
Обработчик всегда выполняется в другом процессе, отличном от того, в котором он был зарегистрирован. Вследствие этого любые ресурсы, управляемые вызывающим процессом (таблицы ETS, открытые файлы и другие), не будут доступны к моменту вызова функции обработчика.
Функция должна принимать код возврата выхода в качестве аргумента.
build_info()
Характеристики
build_info() :: %{
build: String.t(),
date: String.t(),
revision: String.t(),
version: String.t(),
otp_release: String.t()
} Информация о сборке Elixir.
Возвращает карту с версией Elixir, релизом Erlang/OTP, с которым он был скомпилирован, коротким хэшем Git и датой и временем сборки.
Каждое значение в карте — строка, и эти значения:
-
:build- версия Elixir, короткий хэш Git и релиз Erlang/OTP, с которым он был скомпилирован -
:date- строковое представление даты и времени ISO8601, когда он был собран -
:otp_release- релиз OTP, с которым он был скомпилирован -
:revision- короткий хэш Git. Если Git не был доступен во время сборки, он устанавливается в"" -
:version- версия Elixir
Не следует полагаться на конкретные форматы, возвращаемые каждым из этих полей. Вместо этого следует использовать специализированные функции, такие как version/0, чтобы получить версию Elixir, и otp_release/0, чтобы получить релиз Erlang/OTP.
Примеры
iex> System.build_info()
%{
build: "1.9.0-dev (772a00a0c) (compiled with Erlang/OTP 21)",
date: "2018-12-24T01:09:21Z",
otp_release: "21",
revision: "772a00a0c",
version: "1.9.0-dev"
} cmd(command, args, opts \\ [])
Характеристики
cmd(binary(), [binary()], keyword()) ::
{Collectable.t(), exit_status :: non_neg_integer()} Выполняет указанную command с args.
Ожидается, что command будет исполняемым файлом, доступным в PATH, если не указан абсолютный путь.
args должно быть списком двоичных данных, которые исполняемый файл получит в качестве своих аргументов, как есть. Это означает, что:
- переменные окружения не будут интерполированы
- расширение подстановочных знаков не будет происходить (если
Path.wildcard/2не используется явно) - аргументы не нужно экранировать или заключать в кавычки для безопасности оболочки
Эта функция возвращает кортеж, содержащий собранный результат и код выхода команды.
Внутренне эта функция использует Port для взаимодействия с внешним миром. Однако, если вы планируете запустить долго выполняющуюся программу, порты гарантируют, что устройства stdin/stdout будут закрыты, но они не завершают программу автоматически. Документация для модуля Port описывает эту проблему и возможные решения в разделе «Процессы-зомби».
Примеры
iex> System.cmd("echo", ["hello"])
{"hello\n", 0}
iex> System.cmd("echo", ["hello"], env: [{"MIX_ENV", "test"}])
{"hello\n", 0}
iex> System.cmd("echo", ["hello"], into: IO.stream(:stdio, :line))
hello
{%IO.Stream{}, 0}
Параметры
-
:into- вставляет результат в заданный собираемый объект, по умолчанию"" -
:cd- каталог для выполнения команды -
:env- перечислитель кортежей, содержащих имя-значение переменной среды в виде двоичных данных -
:arg0- устанавливает arg0 команды -
:stderr_to_stdout- перенаправляет stderr в stdout, когдаtrue -
:parallelism- еслиtrue, виртуальная машина запланирует задачи порта для повышения параллелизма в системе. Если установленоfalse, виртуальная машина попытается выполнить команды немедленно, улучшив задержку за счёт параллелизма. Значение по умолчанию может быть установлено при запуске системы, передав аргумент "+spp" в--erl.
Причины ошибок
Если предоставлены недопустимые аргументы, ArgumentError генерируется функцией System.cmd/3. System.cmd/3 также ожидает строго определённый набор параметров и выведет ошибку, если указаны неизвестные или недопустимые параметры.
Кроме того, System.cmd/3 может завершиться ошибкой по одной из приведенных ниже причин POSIX:
:system_limit- все доступные порты в эмуляторе Erlang заняты:enomem- не хватает памяти для создания порта:eagain- больше нет доступных процессов операционной системы:enametoolong- внешняя команда слишком длинная:emfile- больше нет доступных дескрипторов файлов (для процесса операционной системы, в котором выполняется эмулятор Erlang):enfile- таблица файлов заполнена (для всей операционной системы):eacces- команда не указывает на исполняемый файл:enoent- команда не указывает на существующий файл
Команды оболочки
Если вам нужно выполнить доверенную команду внутри оболочки с каналами, перенаправлением и т. д., обратитесь к :os.cmd/1.
compiled_endianness()
Характеристики
compiled_endianness() :: :little | :big
Возвращает порядок байтов, с которым была скомпилирована система.
convert_time_unit(time, from_unit, to_unit)
Характеристики
convert_time_unit(integer(), time_unit() | :native, time_unit() | :native) :: integer()
Преобразует time из единицы измерения времени from_unit в единицу измерения времени to_unit.
Результат округляется с помощью функции floor.
convert_time_unit/3 принимает дополнительную единицу измерения времени (отличную от тех, что в типе time_unit/0) под названием :native. :native — единица измерения времени, используемая системой выполнения Erlang. Она определяется при запуске системы выполнения и остаётся неизменной до её остановки, но может отличаться при следующем запуске системы выполнения на том же компьютере. По этой причине вы должны использовать эту функцию для преобразования единиц измерения времени :native в предсказуемую единицу измерения перед отображением их пользователю.
Чтобы определить, сколько секунд представляет собой единица измерения :native в вашей текущей системе выполнения, вы можете вызвать эту функцию для преобразования 1 секунды в единицу измерения времени :native: System.convert_time_unit(1, :second, :native).
cwd()
Характеристики
cwd() :: String.t() | nil
Текущий рабочий каталог.
Возвращает текущий рабочий каталог или nil если таковой отсутствует.
cwd!()
Характеристики
cwd!() :: String.t()
Текущий рабочий каталог, исключение при ошибке.
Возвращает текущий рабочий каталог или вызывает RuntimeError.
delete_env(varname)
Характеристики
delete_env(String.t()) :: :ok
Удаляет переменную окружения.
Удаляет переменную varname из окружения.
endianness()
Характеристики
endianness() :: :little | :big
Возвращает порядок байтов.
fetch_env(varname)
Характеристики
fetch_env(String.t()) :: {:ok, String.t()} | :error Возвращает значение заданной переменной окружения или :error если она не найдена.
Если переменная окружения varname установлена, то возвращается {:ok, value}, где value — строка. Если varname не установлена, возвращается :error.
Примеры
iex> System.fetch_env("PORT")
{:ok, "4000"}
iex> System.fetch_env("NOT_SET")
:error fetch_env!(varname)
Характеристики
fetch_env!(String.t()) :: String.t()
Возвращает значение заданной переменной окружения или генерирует исключение, если она не найдена.
То же самое, что и get_env/1, но генерирует исключение вместо возвращения nil при отсутствии переменной.
Примеры
iex> System.fetch_env!("PORT")
"4000"
iex> System.fetch_env!("NOT_SET")
** (ArgumentError) could not fetch environment variable "NOT_SET" because it is not set find_executable(program)
Характеристики
find_executable(binary()) :: binary() | nil
Находит исполняемый файл в системе.
Эта функция ищет исполняемый файл, заданный по имени, используя переменную окружения PATH в системах Windows и Unix-подобных системах. Она также учитывает правильное расширение исполняемого файла для каждой операционной системы, поэтому для Windows она будет пытаться найти файлы с .com, .cmd или похожими расширениями.
get_env()
Характеристики
get_env() :: %{optional(String.t()) => String.t()} Возвращает все переменные окружения системы.
Возвращаемое значение — карта, содержащая пары имя-значение. Имена переменных и их значения — строки.
get_env(varname, default \\ nil)
Характеристики
get_env(String.t(), String.t() | nil) :: String.t() | nil
Возвращает значение заданной переменной окружения.
Возвращаемое значение переменной окружения varname является строкой. Если переменная окружения не установлена, возвращается строка, указанная в default или nil, если не указана.
Примеры
iex> System.get_env("PORT")
"4000"
iex> System.get_env("NOT_SET")
nil
iex> System.get_env("NOT_SET", "4001")
"4001" get_pid()
Характеристики
get_pid() :: binary()
Идентификатор процесса виртуальной машины Erlang.
Возвращает идентификатор процесса текущего эмулятора Erlang в формате, обычно используемом средой операционной системы.
Для получения дополнительной информации см. :os.getpid/0.
halt(status \\ 0)
Характеристики
halt(non_neg_integer() | binary() | :abort) :: no_return()
Немедленно останавливает систему выполнения Erlang.
Завершает работу системы выполнения Erlang без надлежащего завершения работы приложений и портов. Обратитесь к stop/1 для аккуратной остановки системы.
status должно быть неотрицательным целым числом, атомом :abort или двоичным значением.
Если целое число, система выполнения завершается с целым значением, возвращаемым операционной системе.
Если
:abort, система выполнения прерывается, создавая дамп ядра, если это разрешено в операционной системе.Если строка, создается дамп сбоя Erlang со статусом как слоган, после чего система выполнения завершается со статусом 1.
Обратите внимание, что во многих платформах операционная система поддерживает только коды статуса от 0 до 255.
Для получения дополнительной информации см. :erlang.halt/1.
Примеры
System.halt(0) System.halt(1) System.halt(:abort)
monotonic_time()
Характеристики
monotonic_time() :: integer()
Возвращает текущее монотонное время в единицах :native.
Это время монотонно возрастает и начинается в неуказанную точку времени.
Встраивается компилятором.
monotonic_time(unit)
Характеристики
monotonic_time(time_unit()) :: integer()
Возвращает текущее монотонное время в заданной единице измерения времени.
Это время монотонно возрастает и начинается в неуказанную точку времени.
no_halt()
Характеристики
no_halt() :: boolean()
Проверяет, будет ли система остановлена по завершении обработки ARGV.
no_halt(boolean)
Характеристики
no_halt(boolean()) :: :ok
Помечает, должна ли система быть остановлена по завершении обработки ARGV.
os_time()
Характеристики
os_time() :: integer()
Возвращает текущее системное время (OS).
Результат возвращается в единицах :native.
Это время может быть скорректировано вперёд или назад без ограничений и не является монотонным.
Встраивается компилятором.
os_time(unit)
Характеристики
os_time(time_unit()) :: integer()
Возвращает текущее системное время (OS) в заданной единице измерения времени unit.
Это время может быть скорректировано вперёд или назад без ограничений и не является монотонным.
otp_release()
Характеристики
otp_release() :: String.t()
Возвращает номер версии Erlang/OTP.
pid()
Характеристики
pid() :: String.t()
Возвращает системный PID для текущего экземпляра системы выполнения Erlang.
Возвращает строку, содержащую (обычно) числовой идентификатор процесса. В системах Unix-подобных операционных системах это, как правило, возвращаемое значение системного вызова getpid(). В Windows используется идентификатор процесса, возвращаемый системным вызовом GetCurrentProcessId().
Примеры
System.pid()
put_env(enum)
Характеристики
put_env(Enumerable.t()) :: :ok
Устанавливает несколько переменных окружения.
Устанавливает новое значение для каждой переменной окружения, соответствующей каждой паре {key, value} в enum.
put_env(varname, value)
Характеристики
put_env(binary(), binary()) :: :ok
Устанавливает значение переменной окружения.
Устанавливает новое значение value для переменной окружения varname.
restart()
Характеристики
restart() :: :ok
Перезапускает все приложения в системе выполнения Erlang.
Все приложения останавливаются плавно, весь код загружается, и все порты закрываются перед тем, как система снова запускает все приложения.
Примеры
System.restart()
schedulers()
Характеристики
schedulers() :: pos_integer()
Возвращает количество планировщиков в виртуальной машине.
schedulers_online()
Характеристики
schedulers_online() :: pos_integer()
Возвращает количество активных планировщиков в виртуальной машине.
stacktrace()
Устаревший механизм получения последнего трассировки стека исключения.
Доступ к трассировке стека вне блока rescue/catch устарел. Если вы хотите поддерживать только Elixir v1.7+, вы должны получить доступ к __STACKTRACE__/0 внутри блока rescue/catch. Если вы хотите поддерживать более ранние версии Elixir, поместите System.stacktrace/0 внутри блока rescue/catch.
Обратите внимание, что виртуальная машина Erlang (и, следовательно, эта функция) не возвращает текущую трассировку стека, а скорее трассировку стека последнего исключения. Чтобы получить трассировку стека текущего процесса, используйте Process.info(self(), :current_stacktrace) вместо этого.
stop(status \\ 0)
Характеристики
stop(non_neg_integer() | binary()) :: no_return()
Аккуратно останавливает систему выполнения Erlang.
Все приложения останавливаются плавно, весь код выгружается, и все порты закрываются перед завершением работы системы, вызвав halt/1.
status должно быть неотрицательным целым значением, которое возвращается системой выполнения операционной системе.
Обратите внимание, что во многих платформах операционная система поддерживает только коды статуса от 0 до 255.
Примеры
System.stop(0) System.stop(1)
system_time()
Характеристики
system_time() :: integer()
Возвращает текущее системное время в единицах :native.
Это представление времени в виртуальной машине os_time/0. Они могут не совпадать в случае временных искажений, хотя виртуальная машина стремится их согласовать. Это время не монотонно.
Встраивается компилятором.
system_time(unit)
Характеристики
system_time(time_unit()) :: integer()
Возвращает текущее системное время в заданной единице измерения времени.
Это представление времени в виртуальной машине os_time/0. Они могут не совпадать в случае временных искажений, хотя виртуальная машина стремится их согласовать. Это время не монотонно.
time_offset()
Характеристики
time_offset() :: integer()
Возвращает текущий временной сдвиг между монотонным временем виртуальной машины Erlang и системным временем виртуальной машины Erlang.
Результат возвращается в единицах :native.
См. time_offset/1 для получения дополнительной информации.
Встраивается компилятором.
time_offset(unit)
Характеристики
time_offset(time_unit()) :: integer()
Возвращает текущий временной сдвиг между монотонным временем виртуальной машины Erlang и системным временем виртуальной машины Erlang.
Результат возвращается в заданной единице измерения времени unit. Возвращаемый сдвиг, добавленный к монотонному времени Erlang (например, полученному с помощью monotonic_time/1), дает системное время Erlang, которое соответствует этому монотонному времени.
tmp_dir()
Характеристики
tmp_dir() :: String.t() | nil
Директория временных файлов для записи.
Возвращает директорию временных файлов для записи. Поиск директорий происходит в следующем порядке:
- директория, указанная в переменной окружения TMPDIR
- директория, указанная в переменной окружения TEMP
- директория, указанная в переменной окружения TMP
-
C:\TMPв Windows или/tmpв Unix-подобных операционных системах - в крайнем случае, текущая рабочая директория
Возвращает nil, если ни одна из вышеперечисленных директорий не является доступной для записи.
tmp_dir!()
Характеристики
tmp_dir!() :: String.t()
Директория временных файлов для записи, исключение при ошибке.
Аналогично tmp_dir/0, но вместо возвращения nil при отсутствии временной директории, генерирует исключение RuntimeError.
unique_integer(modifiers \\ [])
Характеристики
unique_integer([:positive | :monotonic]) :: integer()
Генерирует и возвращает целое число, уникальное в текущей инстанции.
"Уникальность" означает, что эта функция, вызываемая с одним и тем же списком modifiers, никогда не вернёт одно и то же целое число более одного раза в текущей инстанции.
Если modifiers является [], то возвращается уникальное целое число (может быть положительным или отрицательным). Другие модификаторы могут быть переданы для изменения свойств возвращаемого целого числа:
-
:positive- возвращаемое целое число гарантированно положительное. -
:monotonic- возвращаемое целое число монотонно возрастает. Это означает, что в одной и той же инстанции (даже в разных процессах), целые числа, возвращаемые с модификатором:monotonic, всегда будут строго меньше целых чисел, возвращаемых последующими вызовами с модификатором:monotonic.
Все вышеперечисленные модификаторы могут быть объединены; повторяющиеся модификаторы в modifiers будут игнорироваться.
Встраивается компилятором.
user_home()
Характеристики
user_home() :: String.t() | nil
Директория пользователя.
Возвращает домашнюю директорию пользователя (независимо от платформы).
user_home!()
Характеристики
user_home!() :: String.t()
Директория пользователя, исключение при ошибке.
Аналогично user_home/0, но вместо возвращения nil при отсутствии домашней директории, генерирует исключение RuntimeError.
version()
Характеристики
version() :: String.t()
Информация о версии Elixir.
Возвращает информацию о версии Elixir в виде двоичной строки.
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.10.4/System.html