Как запустить файл .sh в Linux: полное руководство для начинающих и системных администраторов
Скрипты оболочки — основа автоматизации Linux. Будь то развертывание веб-приложения, планирование резервных копий или настройка недавно подготовленного сервера, .sh файлы позволяют объединить сложные последовательности команд в один повторяемый исполняемый файл. Это руководство проведет вас через все методы запуска скриптов оболочки в Linux — от базового выполнения до фоновых процессов и планирования cron — с лучшими практиками, которые работают в производственных средах.
Что такое файл .sh в Linux?
Файл .sh — это простой текстовый скрипт, написанный на языке оболочки (обычно Bash или POSIX sh), который оболочка Linux интерпретирует и выполняет строка за строкой. Скрипты оболочки используются для:
- Автоматизации повторяющихся задач системного администрирования
- Развертывания и настройки приложений
- Управления пользователями, разрешениями и файловыми системами
- Планирования работ обслуживания, таких как резервные копии и ротация журналов
- Начальной загрузки новых серверов после подготовки
Если вы управляете средой VPS Hosting или Dedicated Server, написание скриптов оболочки — это незаменимый навык, который сэкономит вам часы ручной работы каждую неделю.
Предварительные требования
Перед запуском любого файла .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 (разрешение на выполнение не требуется)
Вы можете вызвать скрипт оболочки, явно вызвав интерпретатор, даже если файл не имеет разрешений на выполнение. Это особенно полезно для быстрого тестирования скрипта перед тем, как сделать его постоянно исполняемым.
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 запускает скрипт в текущей сессии оболочки, а не порождает подоболочку. Это означает, что любые переменные или функции, определенные в скрипте, сохраняются в вашей текущей среде.
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 явно |
Лучшие практики для написания и запуска скриптов оболочки
Следование этим практикам сделает ваши скрипты безопаснее, более поддерживаемыми и легче отлаживаемыми — особенно в серверных средах.
1. Всегда начинайте со строки Shebang
Первая строка каждого скрипта должна объявлять интерпретатор:
#!/bin/bashили для максимальной портативности:
#!/usr/bin/env bash2. Включите строгий режим
Добавьте это в начало каждого производственного скрипта:
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/ | Системные скрипты, доступные всем пользователям |
| ###PPT_NOTR |
