Сэкономьте 15% на всех хостинговых услугах

Проверьте свои навыки и получите скидку на любой тарифный план

Используйте код: Skills Начать
Рубрики
Linux Администрация

Как запустить файл .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.shGNU BashДа
sh script.shPOSIX 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 AM0 2 * * *Ночная резервная копия базы данных
Каждый понедельник в 6:00 AM0 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 bash

2. Включите строгий режим

Добавьте это в начало каждого 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>&1

7. Сначала протестируйте скрипты в безопасной среде

Перед развертыванием скрипта на production-сервер протестируйте его в staging-окружении или на одноразовом экземпляре VPS, где ошибки не вызовут простой.

Запуск Shell-скриптов на Linux-сервере: практические соображения

При запуске скриптов на удаленном Linux-сервере — будь то общая среда или выделенная машина — необходимо учитывать несколько дополнительных факторов:

  • SSH доступ: Большинство серверных скриптов запускаются через SSH. Инструменты вроде screen или tmux позволяют поддерживать постоянные сеансы, благодаря чему долгоживущие скрипты сохраняются при разрывах соединения.
  • Права пользователя: В среде общего хостинга ваша способность выполнять скрипты может быть ограничена. VPS с cPanel дает вам полный root-доступ и полный контроль над выполнением скриптов.
  • Автоматизированные развертывания: Комбинируйте shell-скрипты с cron-заданиями для автоматизации развертываний, обновления сертификатов (особенно полезно в сочетании с SSL-сертификатами) и плановых задач обслуживания.
  • Переменные окружения: Скрипты, запускаемые через cron или SSH, могут не наследовать окружение вашей интерактивной оболочки. Определяйте все необходимые переменные явно в скрипте или подключайте файл профиля.

Краткий справочник: все методы с первого взгляда

МетодКомандаСлучай использования
Выполнить с разрешениемchmod +x script.sh && ./script.shСтандартное выполнение
Запустить с bashbash script.shРазрешение на выполнение не требуется
Запустить с shsh script.shPOSIX-совместимые скрипты
Запустить от имени rootsudo ./script.shСкрипты, требующие повышенных привилегий
Запустить в фоне./script.sh &Неблокирующее выполнение
Запустить постоянноnohup ./script.sh &Сохранение при выходе из SSH
Запланировать с croncrontab -eПовторяющиеся автоматизированные задачи
Загрузить скриптsource script.shПрименить изменения к текущей оболочке

Заключение

Запуск .sh файлов в Linux — это фундаментальный навык, который раскрывает полную мощь автоматизации системы. Основной рабочий процесс прост: предоставьте разрешение на выполнение с помощью chmod +x, затем запустите скрипт с помощью ./script.sh или bash script.sh. Для производственных сред объедините абсолютные пути, строгий режим, логирование и планирование cron для создания надежных и стабильных конвейеров автоматизации.

Если вы управляете скриптами на сервере, качество вашей хостинг-инфраструктуры имеет значение. VPS Hosting и Dedicated Servers AlexHost предоставляют вам полный root-доступ, стабильное время безотказной работы и производительность, необходимую для уверенного запуска рабочих нагрузок автоматизации — будь то планирование ночных резервных копий, развертывание приложений или управление сложными многоскриптовыми рабочими процессами.