Как да стартирате .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)
Някои скриптове изискват привилегии на root ниво, за да модифицират системни файлове, управляват услуги, инсталират пакети или променят конфигурации на мрежата. Използвай sudo за повишаване на разрешенията:
sudo ./script.shили предай скрипта директно на bash с повишени права:
sudo bash script.shВажни съображения за сигурност
- Никога не изпълнявай скрипт като root без да го прочетеш първо. Злонамерен или лошо написан скрипт с sudo достъп може да причини необратимо повреждане на системата.
- Предпочитай изпълнението на скриптове с минимално необходимите привилегии.
- Ако скриптът трябва само да пише в конкретен директорий, разгледай коригирането на разрешенията на директориума, вместо да изпълняваш целия скрипт като root.
Метод 5: Изпълни скрипта в фона
По подразбиране, изпълнението на скрипт в терминала блокира твоята сесия, докато скриптът завърши. За дълготрайни задачи — като големи прехвърляния на файлове, миграции на база данни или изграждане на сървър — ще искаш да изпратиш процеса в фона.
Използване на оператора &
./script.sh &Символът & разклонява процеса в фона и веднага връща контрола на твоя терминал. Shell отпечатва PID (Process ID) на фоновата задача, който можеш да използваш, за да я мониториш или прекратиш по-късно.
Поддържай скрипта работещ след излизане с 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 -eCron синтаксис
* * * * * /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"5. Организирай скриптовете в посветени директориуми
| Директорий | Препоръчано използване |
|---|---|
/usr/local/bin/ | Системни скриптове, достъпни за всички потребители |
