Система
Модуль System предоставляет функции, которые взаимодействуют непосредственно с виртуальной машиной или с хост-системой.
Время
Модуль System также предоставляет функции, работающие со временем, возвращая различные значения времени, хранимые системой, с поддержкой различных единиц времени.
Одна из сложностей, связанных с использованием системного времени, заключается в том, что оно может корректироваться. Например, при переходе на летнее/зимнее время системные часы будут корректироваться, часто добавляя или удаляя один час. Такие изменения мы называем «временными скачками».
## DO NOT DO THIS prev = System.os_time() # ... execute some code ... next = System.os_time() diff = next - prev
Если во время выполнения кода системные часы изменяются, может оказаться, что некоторый код, выполнявшийся в течение 1 секунды, будет показан как занявший более 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.
- 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()
Возвращает идентификатор процесса операционной системы для текущего экземпляра системы выполнения Erlang.
- put_env(enum)
Устанавливает несколько переменных окружения.
- put_env(varname, value)
Устанавливает значение переменной окружения.
- restart()
Перезапускает все приложения в системе выполнения Erlang.
- schedulers()
Возвращает количество планировщиков в виртуальной машине.
- schedulers_online()
Возвращает количество активных планировщиков в виртуальной машине.
- stacktrace()
Устаревший механизм для получения последнего стека исключений.
- stop(status \\ 0)
Аккуратно останавливает систему выполнения Erlang.
- system_time()
Возвращает текущее системное время в единицах измерения времени
:native.- system_time(unit)
Возвращает текущее системное время в заданных единицах измерения времени.
- time_offset()
Возвращает текущий сдвиг времени между монотонным временем виртуальной машины Erlang и системным временем виртуальной машины Erlang.
- time_offset(unit)
Возвращает текущий сдвиг времени между монотонным временем виртуальной машины Erlang и системным временем виртуальной машины 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 (так как время будет возвращено в миллисекундах).
Функции
argv()
Specs
argv() :: [String.t()]
Выводит аргументы командной строки.
Возвращает список аргументов командной строки, переданных программе.
argv(args)
Specs
argv([String.t()]) :: :ok
Изменяет аргументы командной строки.
Изменяет список аргументов командной строки. Используйте с осторожностью, так как это уничтожает любые предыдущие данные argv.
at_exit(fun)
Specs
at_exit((non_neg_integer() -> any())) :: :ok
Регистрирует функцию обработчика завершения программы.
Регистрирует функцию, которая будет вызвана в конце выполнения программы. Полезно для вызова хука в режиме «скрипт».
Обработчик всегда выполняется в другом процессе, чем тот, в котором он был зарегистрирован. Вследствие этого любые ресурсы, управляемые вызывающим процессом (таблицы ETS, открытые файлы и т. д.), не будут доступны к моменту вызова функции обработчика.
Функция должна принимать код состояния завершения в качестве аргумента.
build_info()
Specs
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, когда она была построена -
:opt_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 \\ [])
Specs
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, VM будет планировать задачи порта для повышения параллелизма в системе. Если установленоfalse, VM будет пытаться выполнить команды немедленно, улучшая время отклика в ущерб параллелизму. Значение по умолчанию может быть установлено при запуске системы, передав аргумент «+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()
Specs
compiled_endianness() :: :little | :big
Возвращает порядок байтов, с которым была скомпилирована система.
convert_time_unit(time, from_unit, to_unit)
Specs
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()
Specs
cwd() :: String.t() | nil
Текущий рабочий каталог.
Возвращает текущий рабочий каталог или nil если таковой не доступен.
cwd!()
Specs
cwd!() :: String.t()
Текущий рабочий каталог, исключение при ошибке.
Возвращает текущий рабочий каталог или вызывает RuntimeError.
delete_env(varname)
Specs
delete_env(String.t()) :: :ok
Удаляет переменную среды.
Удаляет переменную varname из среды.
endianness()
Specs
endianness() :: :little | :big
Возвращает порядок байтов.
fetch_env(varname)
Specs
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)
Specs
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)
Specs
find_executable(binary()) :: binary() | nil
Находит исполняемый файл в системе.
Эта функция ищет исполняемую программу по заданному имени, используя переменную среды PATH в Unix и Windows. Она также учитывает правильное расширение исполняемого файла для каждой операционной системы, поэтому в Windows она будет пытаться найти файлы с .com, .cmd или подобными расширениями.
get_env()
Specs
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()
Возвращает текущее время операционной системы (ОС).
Результат возвращается в :native единицах времени.
Это время может быть скорректировано вперёд или назад без ограничений и не является монотонным.
Встраивается компилятором.
os_time(unit)
Характеристики
os_time(time_unit()) :: integer()
Возвращает текущее время операционной системы (ОС) в заданной единице времени unit.
Это время может быть скорректировано вперёд или назад без ограничений и не является монотонным.
otp_release()
Характеристики
otp_release() :: String.t()
Возвращает номер выпуска Erlang/OTP.
pid()
Характеристики
pid() :: String.t()
Возвращает идентификатор процесса операционной системы для текущего экземпляра системы выполнения 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, но вызывает RuntimeError вместо возвращения nil при отсутствии каталога временных файлов.
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, но вызывает RuntimeError вместо возвращения nil при отсутствии домашней директории пользователя.
version()
Характеристики
version() :: String.t()
Информация о версии Elixir.
Возвращает версию Elixir в виде бинарного значения.
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/elixir/1.9.4/System.html