Запуск интерпретируемых скриптов #
Андрей Михайлович Васильев, 2025
Версии презентации
Исполняемые файлы в Linux #
Всего можно выделить 2 типа исполняемых файла:
- Бинарные приложения, содержащие бинарный код для исполнения на процессоре
- Интерпретируемые приложения, состоящие из кода, запускаемого интерпретатором
Для запуска первых приложений достаточно только ОС, для работы вторых нужен установленный интерпретатор или соответствующая исполнительная машина
Типичный способ запуска таких приложений выглядит следующим образом:
# интерпретатор файл-приложения
python app.py
ruby app.rb
bash script.sh
Приложения-интерпретаторы зачастую являются бинарными приложениями
Проблема выбора интерпретатора #
- Расширение файла
.py
говорит, что необходимо использовать Python - Расширение файла
.lua
указывает, что необходимо использовать Lua - Можно посмотреть на исходный код приложения, чтобы определить какой интерпретатор нужен для его запуска
Однако такой способ запуска сложен для обычного пользователя:
- Выяснение интерпретатора — дополнительный шаг перед вызовом приложения
- Пользователь может не знать названия всех интерпретаторов
- Пользователь точно не знает синтаксиса всех языков
- Файл может не иметь расширения
- В системе может быть несколько интерпретаторов одного языка программирования
Указание интерпретатора с Shebang #
В UNIX-мире есть механизм Shebang, позволяющий указать интерпретатор
- Текстовому файлу должны быть выданы права на выполнение
- В начале текстового файла может быть указана строка
#!интерпретатор [аргумент]
Когда пользователь запускает файл с Shebang
- Загрузчик приложений анализирует первую строку файла
- Загрузчик считывает данные из Shebang
- Загрузчик запускает приложение-интерпретатор по пути Shebang, передавая ему в качестве аргумента путь к данному файлу
Поддерживается передача только одного аргумента, поэтому однобуквенные ключи можно объединять в один аргумент
Пример добавления информации к скрипту #
Рассмотрим простейшее приложение на языке Bash:
#!/bin/bash
echo 'Hello, world!'
Запишем его в файл /home/user/script.sh
и дадим права на исполнение
$ cd /home/user
$ chmod +x script.sh
$ ./script.sh
Hello, world!
В результате будет запущено приложение /bin/bash
, которому передадут путь к
файлу /home/user/script.sh
:
/bin/bash /home/user/script.sh
Строки, начинающиеся на #
, считаются комментариями
Варианты Shebang #
#!/bin/sh
— запуск интерпретатора Bourne Shell или совместимого с ним.#!/bin/bash
— запуск файла с помощью интерпретатора Bash.#!/usr/bin/python3
— запуск файла с помощью системного интерпретатора Python 3#!/usr/bin/env ruby
— запуск файла с помощью интерпретатора Ruby, поиск которого надо выполнять в PATH пользователя, вызывающего приложение#!/bin/false
— запретить выполнение файла через запуск, нужно например для файлов, предназначеных только для подключения к другим исполняемым скриптам
Путь к интерпретатору должен быть абсолютным, т.к. данный механизм не использует подсистему поиска исполняемого файла в PATH
Если необходима функциональность по поиску интерпретатора, тогда следует использовать /usr/bin/env
Выбор языка для написания скриптов #
Исполняемые скрипты для выполнения административных задач в Linux можно писать на множестве языков: Python, Ruby, Perl, Bash и так далее
При выборе языка программирования необходимо учитывать множество факторов:
- Сколько времени нужно будет поддерживать скрипт?
- Кто будет поддерживать скрипт?
- Насколько сложную задачу необходимо решать?
- Сложность задачи состоит в последовательности вызова программ или в обработке данных?
- Скрипт должен поддерживать работу на одной или нескольких платформах?
Использование Ruby или Python #
Если задача требует сложных вычислений и её необходимо поддерживать достаточно долго, то рекомендуется использовать более продвинутые языки программирования
Использование Ruby #
- Для настройки систем есть специализированные проекты Chef и Puppet
- Для выполнения действий над файлами можно использовать библиотеку FileUtils
- Для запуска внешних процессов есть мощная библиотека open3
- Для выполнения действий по сети есть библиотеки net-ssh и net-scp
Использование Python #
- Для настройки систем есть специализированные проекты Ansible и Salt
- Для выполнения действий над файлами можно использовать библиотеку shutil
- Для запуска внешних процессов есть библиотека Subprocess
- Для выполнения действий по SSH есть библиотека paramiko