Як запустити файл .sh у Linux: повний посібник для початківців та системних адміністраторів
Shell-скрипти є основою автоматизації Linux. Незалежно від того, чи ви розгортаєте веб-додаток, плануєте резервні копії або налаштовуєте щойно підготовлений сервер, .sh файли дозволяють об’єднати складні послідовності команд в один повторюваний виконуваний файл. Цей посібник проведе вас через кожен метод запуску shell-скриптів у Linux — від базового виконання до фонових процесів і планування cron — з найкращими практиками, які витримують виробничі середовища.
Що таке .sh файл у Linux?
Файл .sh — це звичайний текстовий скрипт, написаний мовою shell (зазвичай Bash або POSIX sh), який Linux shell інтерпретує та виконує рядок за рядком. 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Префікс ./ вказує shell шукати в поточному каталозі, а не в системному $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)
Деякі скрипти вимагають привілеїв кореневого рівня для зміни системних файлів, управління сервісами, встановлення пакетів або зміни конфігурацій мережі. Використовуйте sudo для підвищення дозволів:
sudo ./script.shабо передайте скрипт безпосередньо bash з підвищеними правами:
sudo bash script.shВажливі міркування безпеки
- Ніколи не запускайте скрипт як root без його попереднього прочитання. Шкідливий або погано написаний скрипт з доступом sudo може спричинити незворотну шкоду системі.
- Надавайте перевагу запуску скриптів з мінімально необхідними привілеями.
- Якщо скрипту потрібно лише писати в певний каталог, розглядайте можливість коригування дозволів каталогу замість запуску всього скрипту як root.
Метод 5: Запустіть скрипт у фоні
За замовчуванням запуск скрипту в терміналі блокує вашу сесію до завершення скрипту. Для довгострокових завдань — таких як великі передачі файлів, міграція баз даних або побудова серверів — ви захочете відправити процес у фон.
Використання оператора &
./script.sh &Символ & розгалужує процес у фон і негайно повертає контроль вашому терміналу. Shell виводить 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 ранку | 0 2 * * * | Нічна резервна копія бази даних |
| Кожного понеділка о 6:00 ранку | 0 6 * * 1 | Щотижневе обертання журналу |
| Щогодини | 0 * * * * | Перевірка моніторингу доступності |
| Кожні 15 хвилин | */15 * * * * | Оновлення кешу |
| При перезавантаженні системи | @reboot | Запуск сервісу або скрипту при завантаженні |
Приклад: Автоматизована щоденна резервна копія
0 2 * * * /home/user/scripts/backup.sh >> /var/log/backup.log 2>&1Це запускає backup.sh щодня о 2:00 ранку і додає як стандартний вихід, так і помилки до файлу журналу для аудиту.
> Порада професіонала: Завжди використовуйте абсолютні шляхи в записах cron. Cron запускається з мінімальним середовищем і може не мати доступу до того ж $PATH як ваш інтерактивний shell.
Метод 7: Джерело скрипту (запуск у контексті поточного shell)
Існує ще один метод виконання, який варто знати: sourcing скрипту. На відміну від методів вище, sourcing запускає скрипт у поточній сесії shell, а не створює під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. Увімкніть суворий режим
Додайте це біля верхівки кожного виробничого скрипту:
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"