Как запустить файл .sh в Linux: полное руководство для начинающих и системных администраторов
Shell scripts являются основой автоматизации Linux. Будь то развертывание веб-приложения, планирование резервных копий или настройка недавно подготовленного сервера, .sh файлы позволяют объединить сложные последовательности команд в один повторяемый исполняемый файл. Это руководство проведет вас через каждый метод запуска shell scripts в Linux — от базового выполнения до фоновых процессов и планирования cron — с лучшими практиками, которые работают в production-среде.
Что такое файл .sh в Linux?
Файл .sh — это простой текстовый скрипт, написанный на языке shell (обычно Bash или POSIX sh), который интерпретирует и выполняет построчно оболочка Linux. Скрипты shell используются для:
- Автоматизации повторяющихся задач системного администрирования
- Развертывания и настройки приложений
- Управления пользователями, разрешениями и файловыми системами
- Планирования задач обслуживания, таких как резервное копирование и ротация логов
- Инициализации новых серверов после подготовки
Если вы управляете окружением VPS Hosting или Dedicated Server, написание скриптов shell — это незаменимый навык, который сэкономит вам часы ручной работы каждую неделю.
Предварительные требования
Перед запуском любого .sh файла убедитесь, что у вас есть:
- Доступ к терминалу Linux (локально или через SSH)
- Учетная запись пользователя с соответствующими разрешениями
- Файл скрипта уже в системе (созданный локально или переданный через SCP/SFTP)
Метод 1: Сделайте файл исполняемым с помощью chmod
По умолчанию вновь созданные или загруженные .sh файлы не имеют прав на выполнение. Перед запуском скрипта как программы необходимо явно предоставить права на выполнение с помощью команды chmod.
chmod +x script.shЧтобы проверить, были ли разрешения применены правильно:
ls -l script.shВы должны увидеть результат, похожий на:
-rwxr-xr-x 1 user user 1024 Jun 10 14:32 script.shФлаги x подтверждают, что файл теперь исполняемый владельцем, группой и другими.
> Совет по безопасности: Если вы хотите ограничить выполнение только владельцем файла, используйте chmod 700 script.sh вместо chmod +x.
Способ 2: Запуск скрипта с использованием относительного или абсолютного пути
После того как файл станет исполняемым, вы можете запустить его непосредственно из терминала.
Использование относительного пути (текущий каталог)
Если скрипт находится в вашем текущем рабочем каталоге, добавьте перед ним ./:
./script.shСимвол ./ указывает оболочке искать в текущем каталоге, а не в системе $PATH.
Использование абсолютного пути
Если скрипт находится в другом месте, укажите его полный путь:
/home/user/scripts/script.shили
/usr/local/bin/script.shИспользование абсолютных путей особенно важно при запуске скриптов из cron-заданий или других автоматизированных контекстов, где рабочий каталог может отличаться.
Способ 3: Запуск скрипта с помощью bash или sh (разрешение на выполнение не требуется)
Вы можете вызвать shell-скрипт, явно указав интерпретатор, даже если файл не имеет разрешения на выполнение. Это особенно полезно для быстрого тестирования скрипта перед тем, как сделать его постоянно исполняемым.
bash script.shили для POSIX-совместимых скриптов:
sh script.shРазница между bash и sh
| Команда | Интерпретатор | Поддерживает функции, специфичные для Bash |
|---|---|---|
bash script.sh | GNU Bash | Да |
sh script.sh | POSIX sh (часто dash на Ubuntu) | Нет |
Если ваш скрипт использует синтаксис, специфичный для Bash, такой как массивы, [[ ]] условные выражения или подстановка процессов, всегда используйте bash вместо sh.
Метод 4: Запуск скрипта от суперпользователя (sudo)
Некоторые скрипты требуют привилегий уровня root для изменения системных файлов, управления сервисами, установки пакетов или изменения конфигурации сети. Используйте sudo для повышения прав доступа:
sudo ./script.shили передайте скрипт непосредственно в bash с повышенными правами:
sudo bash script.shВажные соображения безопасности
- Никогда не запускайте скрипт от root без предварительного прочтения. Вредоносный или плохо написанный скрипт с доступом sudo может привести к необратимому повреждению системы.
- Предпочитайте запуск скриптов с минимально необходимыми привилегиями.
- Если скрипту нужно только писать в определённую директорию, рассмотрите возможность изменения прав доступа к директории вместо запуска всего скрипта от root.
Метод 5: Запуск скрипта в фоновом режиме
По умолчанию запуск скрипта в терминале блокирует вашу сессию до завершения скрипта. Для долгоживущих задач — таких как передача больших файлов, миграция баз данных или сборка серверов — вы захотите отправить процесс в фоновый режим.
Использование оператора &
./script.sh &Символ & разветвляет процесс в фоновом режиме и немедленно возвращает управление вашему терминалу. Оболочка выводит PID (идентификатор процесса) фонового задания, который вы можете использовать для мониторинга или завершения его позже.
Сохранение работы скрипта после выхода с помощью nohup
Если вы отключитесь от SSH, фоновые задания, запущенные с &, обычно завершатся. Используйте nohup для предотвращения этого:
nohup ./script.sh &Вывод по умолчанию перенаправляется в nohup.out. Чтобы указать пользовательский файл журнала:
nohup ./script.sh > /var/log/myscript.log 2>&1 &Мониторинг фоновых заданий
jobs # List background jobs in the current session
ps aux | grep script.sh # Find the process by name
kill PID # Terminate a specific background processМетод 6: Планирование выполнения скриптов с помощью Cron
Для повторяющихся задач — ночные резервные копии, еженедельная очистка, почасовые проверки здоровья — встроенный планировщик cron Linux является стандартным решением.
Откройте редактор Crontab
crontab -eСинтаксис Cron
* * * * * /path/to/script.sh
│ │ │ │ │
│ │ │ │ └── Day of week (0–7, Sunday = 0 or 7)
│ │ │ └──── Month (1–12)
│ │ └────── Day of month (1–31)
│ └──────── Hour (0–23)
└────────── Minute (0–59)Практические примеры Cron
| График | Выражение Cron | Пример использования |
|---|---|---|
| Каждый день в 2:00 AM | 0 2 * * * | Ночная резервная копия базы данных |
| Каждый понедельник в 6:00 AM | 0 6 * * 1 | Еженедельная ротация логов |
| Каждый час | 0 * * * * | Проверка мониторинга доступности |
| Каждые 15 минут | */15 * * * * | Обновление кэша |
| При перезагрузке системы | @reboot | Запуск сервиса или скрипта при загрузке |
Пример: Автоматическая ежедневная резервная копия
0 2 * * * /home/user/scripts/backup.sh >> /var/log/backup.log 2>&1Это запускает backup.sh каждый день в 2:00 AM и добавляет как стандартный вывод, так и ошибки в файл журнала для аудита.
> Совет профессионала: Всегда используйте абсолютные пути в записях cron. Cron работает с минимальной средой и может не иметь доступа к тому же $PATH как ваша интерактивная оболочка.
Метод 7: Источник скрипта (запуск в контексте текущей оболочки)
Есть еще один метод выполнения, который стоит знать: sourcing скрипта. В отличие от методов выше, sourcing запускает скрипт в текущей сессии shell, а не в подоболочке. Это означает, что любые переменные или функции, определенные в скрипте, сохраняются в вашей текущей среде.
source script.shили эквивалентно:
. script.shЭто обычно используется для загрузки переменных окружения, активации виртуальных окружений или применения изменений конфигурации к текущей сессии.
Устранение распространенных ошибок
| Сообщение об ошибке | Вероятная причина | Решение |
|---|---|---|
Permission denied | Файл не имеет разрешения на выполнение | Запустите chmod +x script.sh |
No such file or directory | Неправильный путь или отсутствующий файл | Проверьте путь с помощью ls и pwd |
bad interpreter: No such file or directory | Неправильная строка shebang (например, окончания строк Windows) | Запустите dos2unix script.sh для исправления окончаний строк |
command not found | Скрипт не находится в $PATH и не имеет префикса ./ | Используйте ./script.sh или полный абсолютный путь |
syntax error near unexpected token | Скрипт написан для bash, но запущен с sh | Используйте bash script.sh явно |
Лучшие практики написания и запуска Shell-скриптов
Следование этим практикам сделает ваши скрипты безопаснее, более поддерживаемыми и легче отлаживаемыми — особенно в серверных окружениях.
1. Всегда начинайте с Shebang строки
Первая строка каждого скрипта должна объявлять интерпретатор:
#!/bin/bashили для максимальной портативности:
#!/usr/bin/env bash2. Включите строгий режим
Добавьте это в начало каждого production-скрипта:
set -euo pipefail-e— Выход немедленно, если любая команда не выполнится-u— Рассматривать неустановленные переменные как ошибки-o pipefail— Перехватывать сбои в конвейерных командах
3. Прочитайте скрипт перед его запуском
Никогда не выполняйте файл .sh из внешнего или ненадежного источника без предварительного просмотра его содержимого:
cat script.shили откройте его в текстовом редакторе. Это особенно критично при запуске с sudo.
4. Используйте комментарии щедро
#!/bin/bash
# backup.sh — Daily backup script for /var/www
# Author: sysadmin@example.com
# Last updated: 2024-06-10
# Define source and destination directories
SOURCE="/var/www"
DEST="/mnt/backup"5. Организуйте скрипты в выделенных директориях
| Директория | Рекомендуемое использование |
|---|---|
/usr/local/bin/ | Системные скрипты, доступные всем пользователям |
~/scripts/ или ~/bin/ | Личные пользовательские скрипты |
/opt/scripts/ | Скрипты автоматизации для конкретного приложения |
/etc/cron.daily/ | Скрипты для запуска ежедневно через cron |
6. Логируйте вывод скрипта
Всегда перенаправляйте вывод в файл журнала для скриптов, работающих без присмотра:
./script.sh >> /var/log/script.log 2>&17. Сначала протестируйте скрипты в безопасной среде
Перед развертыванием скрипта на production-сервер протестируйте его в staging-окружении или на одноразовом экземпляре VPS, где ошибки не вызовут простой.
Запуск Shell-скриптов на Linux-сервере: практические соображения
При запуске скриптов на удаленном Linux-сервере — будь то общая среда или выделенная машина — необходимо учитывать несколько дополнительных факторов:
- SSH доступ: Большинство серверных скриптов запускаются через SSH. Инструменты вроде
screenилиtmuxпозволяют поддерживать постоянные сеансы, благодаря чему долгоживущие скрипты сохраняются при разрывах соединения. - Права пользователя: В среде общего хостинга ваша способность выполнять скрипты может быть ограничена. VPS с cPanel дает вам полный root-доступ и полный контроль над выполнением скриптов.
- Автоматизированные развертывания: Комбинируйте shell-скрипты с cron-заданиями для автоматизации развертываний, обновления сертификатов (особенно полезно в сочетании с SSL-сертификатами) и плановых задач обслуживания.
- Переменные окружения: Скрипты, запускаемые через cron или SSH, могут не наследовать окружение вашей интерактивной оболочки. Определяйте все необходимые переменные явно в скрипте или подключайте файл профиля.
Краткий справочник: все методы с первого взгляда
| Метод | Команда | Случай использования |
|---|---|---|
| Выполнить с разрешением | chmod +x script.sh && ./script.sh | Стандартное выполнение |
| Запустить с bash | bash script.sh | Разрешение на выполнение не требуется |
| Запустить с sh | sh script.sh | POSIX-совместимые скрипты |
| Запустить от имени root | sudo ./script.sh | Скрипты, требующие повышенных привилегий |
| Запустить в фоне | ./script.sh & | Неблокирующее выполнение |
| Запустить постоянно | nohup ./script.sh & | Сохранение при выходе из SSH |
| Запланировать с cron | crontab -e | Повторяющиеся автоматизированные задачи |
| Загрузить скрипт | source script.sh | Применить изменения к текущей оболочке |
Заключение
Запуск .sh файлов в Linux — это фундаментальный навык, который раскрывает полную мощь автоматизации системы. Основной рабочий процесс прост: предоставьте разрешение на выполнение с помощью chmod +x, затем запустите скрипт с помощью ./script.sh или bash script.sh. Для производственных сред объедините абсолютные пути, строгий режим, логирование и планирование cron для создания надежных и стабильных конвейеров автоматизации.
Если вы управляете скриптами на сервере, качество вашей хостинг-инфраструктуры имеет значение. VPS Hosting и Dedicated Servers AlexHost предоставляют вам полный root-доступ, стабильное время безотказной работы и производительность, необходимую для уверенного запуска рабочих нагрузок автоматизации — будь то планирование ночных резервных копий, развертывание приложений или управление сложными многоскриптовыми рабочими процессами.
на всех хостинговых услугах