Суброзділ GNU/Linux
csignal
У операційних системах типу Unix (Linux, macOS) сигнали — це форма міжпроцесної взаємодії (IPC). Хоча більшість сигналів мають конкретне призначення (як-от SIGKILL для зупинки процесу), існують спеціальні сигнали, зарезервовані саме для користувацьких потреб.
| # | NAME | C/C++ | htop | |
|---|---|---|---|---|
| 1 | HUP | SIGHUP | SIGHUP | “Hangup” (відбій). Раніше означав розрив зв’язку з терміналом. Зараз часто використовується для того, щоб змусити фонові програми (демони) перечитати конфігураційні файли. |
| 2 | INT | SIGINT | SIGINT | “Interrupt” (переривання). Виникає, коли ви натискаєте Ctrl+C. |
| 3 | QUIT | SIGQUIT | SIGQUIT | Схожий на INT (натискання Ctrl+\), але змушує програму створити “core dump” (знімок пам’яті) для налагодження. |
| 4 | ILL | SIGILL | SIGILL | “Illegal Instruction”. Програма намагається виконати команду, яку процесор не розуміє. |
| 5 | TRAP | SIGTRAP | SIGTRAP | Використовується налагоджувачами (debugger) для встановлення точок зупинки (breakpoints). |
| 6 | ABRT | SIG | SIG | “Abort”. Посилається самою програмою через функцію abort(), зазвичай при критичній помилці в коді. |
| 7 | BUS | - | SIGBUS | Помилка шини. Програма намагається отримати доступ за неправильною адресою пам’яті. |
| 8 | FPE | SIGFPE | SIGFPE | “Floating Point Exception”. Виникає при помилковій математичній операції, наприклад, при діленні на нуль. |
| 9 | KILL | SIGKILL | SIGKILL | Найпотужніший сигнал. Він миттєво вбиває процес. Його неможливо проігнорувати або перехопити через код. |
| 10 | USR1 | - | SIGUSR1 | Ці сигнали не мають визначеного системою значення. |
| 11 | SEGV | SIGSEGV | SIGSEGV | “Segmentation Fault”. Найвідоміша помилка програміста — спроба звернутися до пам’яті, яка програмі не належить. |
| 12 | USR2 | - | SIGUSR2 | Ці сигнали не мають визначеного системою значення. |
| 13 | PIPE | SIGPIPE | SIGPIPE | Виникає, коли програма намагається писати в “трубу” (pipe), інший кінець якої вже закритий. |
| 14 | ALRM | SIGALRM | SIGALRM | Сигнал-будильник. Використовується для таймерів. |
| 15 | TERM | SIGTERM | SIGTERM | “Terminate”. Стандартний сигнал для ввічливого прохання до програми завершити роботу. На відміну від KILL, програма може його “спіймати” і встигнути зберегти дані. |
| 16 | STKFLT | - | SIGSTKFLT | Помилка стека на співпроцесорі (зараз майже не використовується). |
| 17 | CHLD | - | SIGCHLD | “Child”. Надсилається батьківському процесу, коли його дочірній процес завершується або зупиняється. |
| 18 | CONT | - | SIGCONT | “Continue”. Наказує зупиненому процесу продовжити роботу. |
| 19 | STOP | - | SIGSTOP | Зупиняє (ставить на паузу) процес. Як і KILL, його не можна перехопити. |
| 20 | TSTP | - | SIGTSTP | “Terminal Stop”. Виникає при натисканні Ctrl+Z. Зупиняє процес, але його можна перехопити. |
| 21 | SIGTTIN | - | SIGTTIN | Фоновий процес хоче read() з термінала. |
| 22 | SIGTTOU | - | SIGTTOU | Фоновий процес хоче write() в термінал (якщо увімкнено tostop) |
| 23 | URG | - | SIGURG | Термінові дані в мережевому сокеті. |
| 24 | XCPU | - | SIGXCPU | Програма перевищила ліміт часу роботи процесора. |
| 25 | XFSZ | - | SIGXFSZ | Програма намагається створити файл, більший за дозволений ліміт. |
| 26 | VTALRM | - | SIGVTALRM | Віртуальний таймер (враховує тільки час, коли процес працював). |
| 27 | PROF | - | SIGPROF | Використовується для профайлінгу (вимірювання швидкості роботи коду). |
| 28 | WINCH | - | SIGWINCH | Зміна розміру вікна термінала. |
| 29 | POLL | - | SIGPOLL | Подія введення-виведення. |
| 30 | PWR | - | SIGPWR | Помилка живлення (наприклад, коли ДБЖ повідомляє про розряд батареї). |
| 31 | SYS | - | SIGSYS | Неправильний системний виклик. |
| 33 | reserved | - | SIGCANCEL | Використовуються NPTL (Native POSIX Thread Library). Використовується бібліотекою для скасування потоків. |
| 33 | reserved | - | SIGSETXID | Використовуються NPTL (Native POSIX Thread Library).Використовується для синхронізації змін ідентифікаторів користувача/групи (UID/GID) між усіма потоками одного процесу. |
| 34 | - | SIGRTMIN | SIGRTMIN | - |
| 35 | - | - | SIGRTMIN+1 | - |
| .. | - | - | SIGRTMIN+.. | - |
| 64 | - | SIGRTMAX | SIGRTMIN+30 | - |
systemctl
systemctl є головним інструментом для керування системою ініціалізації systemd.
Коли ви віддаєте команду systemctl, вона не просто “вбиває” процес, а намагається керувати ним цивілізовано.
systemctl stop \[service\]
Це найчастіша операція. Systemd діє за певним алгоритмом:
SIGTERM(15). Це “ввічливе” прохання завершити роботу. Програма отримує сигнал і має час, щоб зберегти файли, закрити з’єднання з базою даних і вийти самостійно.- Очікування (Timeout). Systemd чекає (за замовчуванням 90 секунд).
SIGKILL(9). Якщо програма не закрилася за відведений час,systemdнадсилає “контрольний постріл”, який завершує процес миттєво без збереження даних.
systemctl restart \[service\]
Працює точно так само, як stop, а після повного завершення процесу запускає його знову.
systemctl reload \[service\]
Ця команда не зупиняє програму. Вона зазвичай надсилає сигнал SIGHUP (1). Більшість
серверів (як-от Nginx або Apache) налаштовані так, що при отриманні SIGHUP
вони перечитують свої конфігураційні файли, не перериваючи обслуговування користувачів.
| Команда systemctl | Сигнал за замовчуванням | Мета |
|---|---|---|
| stop | SIGTERM | Безпечне завершення. |
| kill | SIGTERM(або інший вказаний) | Негайне надсилання сигналу всій групі процесів. |
| reload | SIGHUP | Оновлення конфігурації без перезапуску. |
| (якщо завис) | SIGKILL | Примусове завершення після таймауту. |
Налаштування сигналів у .service файлі
KillSignal= Вказує, який сигнал надіслати першим при зупинці (systemctl stop). За замовчуванням це SIGTERM. Ви можете змінити його, наприклад, на SIGQUIT або SIGUSR1.RestartKillSignal= Який сигнал використовувати при перезавантаженні.FinalKillSignal= Який сигнал надіслати, якщо програма не закрилася вчасно (за замовчуванням SIGKILL). Його неможливо змінити на щось, що можна ігнорувати.ExecReload= Тут ви можете вказати команду, яка виконується при systemctl reload. Часто туди пишуть/bin/kill -HUP $MAINPID.
Як перевірити, що програма отримала сигнал від systemd?
Коли ви зміните файл сервісу, не забудьте оновити конфігурацію systemd:
Тепер ви можете перевірити логи вашої програми в реальному часі:
Bash yaml parser
yb - bash парсер YAML
yb надає чисте Bash рішення для парсингу YAML.
Використання
Приклади
З репозиторію ви можете швидко спробувати так:
Створення ключів:
додати вбудоване значення:
змінити його:
додати значення списку:
додати ASCII всередині ключа каналу:
Маніпулювати YAML як змінною bash:
Додати його до файлу:
Видалити одне значення:
або видалити все:
Встановлення
З репозиторію
yb можна використовувати безпосередньо з папки репозиторію або скопіювати та використовувати як окремий файл у проекті.
З URL-адреси
Ви можете використовувати цю команду для безпосереднього завантаження скрипта yb, де це необхідно:
Якщо ви хочете, щоб yb був доступний для всієї системи, виконайте цю команду з папки репозиторію:
Однорядковий код
Ви можете використовувати цю команду для завантаження yb у поточну папку одним рядком:
Ви можете використати цю команду для встановлення yb у вашу систему одним рядком:
There may be pirates
У свій форк я додав можливість завантаження парсеру у форматі deb пакету який можна завантажити за цим посиланням
Параметри
Параметри yb поділяються на 3 типи:
action: параметри дії виконуються з файлом і не сумісні один з одним. Вони сумісні зinput, але не зformat.input: параметри введення є параметрами, що встановлюються користувачем, і сумісні один з одним. Вони сумісні як зaction, так і зformat.input: параметри форматування виводять вивід різними способами. Вони сумісні один з одним, з типомinput, але не з типомaction.
| Опція | Ім’я | Тип | Опис | Приклад | Примітки |
|---|---|---|---|---|---|
-a | add | action | Додає ключ(и), значення(я) або обидва. | yb -f "file.yaml" -a -k "key" -v "value" | |
-c | change | action | Змінює значення(я). | yb -f "file.yaml" -c -k "key" -v "new_value" | |
-q | query | action | Виводить true або false, якщо ключ(и), значення(я) або обидва присутні чи ні. | yb -f "file.yaml" -q -k "key" | Для отримання значення каналу -v 'значення каналу' рекомендується використовувати одинарні лапки. |
-r | remove | action | Видаляє ключ(и), значення(я) або обидва. | yb -f "файл.yaml" -r -k "ключ" -v "значення" | Для видалення значення каналу -v 'значення каналу' рекомендується використовувати одинарні лапки. |
-f | file | input | шлях до файлу YAML. | yb -f "файл.yaml" | Файл можна представити без опції -f, як опцію $1. -f та -c несумісні один з одним. |
-o | object | input | об’єкт YAML. | yb -o "${YAML_object}" | Об’єкт YAML можна використовувати з усіма діями. -f та -o сумісні між собою, лише під час додавання об’єкта до файлу. |
-O | object value | input | значення об’єкта YAML. | yb -f "file.yaml" -O "${YAML_object}" | Об’єкт YAML можна використовувати з дією -a. |
-k | key | input | Шлях вибору ключів. | yb -f "file.yaml" -k "ключ" | Підтримує ключі у форматі:key, key.childkey, - list-key, pipe-key|. Можна вказати кілька ключів з роздільником .. |
-v | value | input | Значення, які потрібно додати, видалити, запитати або змінити. | yb -f "file.yaml" -k "ключ" -v "значення" | Підтримує значення у форматі: value, - list-value, |> pipe-value. |
-A | array | формат | Виводить вивід у вигляді масиву bash. | yb -f "file.yaml" -A -k "key" | Забезпечить інше форматування, якщо використовувати з -F або -d. |
-C | colors | format | Примусово використовує кольори у нетермінальному виводі. | yb -Cf "file.yaml" -A -k "key" | |
-d | depth | format | Забезпечує вихід з оригінальною глибиною. | yb -f "file.yaml" -d -k "key.childkey" -v "new_value" | |
-F | format | format | Друкує відформатований вивід для представлення деревоподібності в рядку. | yb -f "file.yaml" -F -k "key" | Забезпечить інше форматування, якщо використовувати з -A або -d. |
-K | keys ключі | format | Друкує лише ключі. | yb -Kf "file.yaml" -k "key" | |
-l | line | format | Друкує { {line}} у кожному рядку. | yb -f "file.yaml" -l -k "key" | |
-L | level | format | Друкує { {<номер рівня>} } у кожному рядку. | yb -f "file.yaml" -L -k "key" | |
-R | raw | format | Друкує вивід без доданих кольорів, коментарів та порожніх рядків. | yb -f "file.yaml" -R -k "key" | |
-n | number | format | Друкує { {<номер рядка>} } на кожному рядку. | yb -f "file.yaml" -n -k "key" | |
-T | type | format | Друкує тип значення. | yb -f "file.yaml" -T -k "key" | Підтримує null, boolean, integer, floating number, string. |
-s | spaces | Deprecated | Вибір кількості пробілів. |
Підтримка YAML
yb забезпечує базову підтримку YAML для редагування та читання YAML-файлу. Починаючи з версії 0.9, yb не підтримує розширені функції, такі як пошук на основі груп, прив’язки, псевдоніми та перевизначення.
Розробка
Повні вихідні коди доступні в папці /src/. Версія, що знаходиться на кореневому рівні, зібрана за допомогою скрипта /src/tools/dist.sh.
Тести
Простий набір тестів доступний у папці tests/. Він представляє різні варіанти використання yb.
Щоб запустити його, виконайте команду нижче з кореневого рівня репозиторію:
Ви можете надати додатковий параметр для вибору парсера (наприклад, під час розробки):
Дякую
Всім вам, YAML-івцям!
Зроблено t0pd4wn на Bash.
Створення власного debian пакету
Огляд
Пакет Debian є найпростішим і найефективнішим способом розповсюдження програмного забезпечення в дистрибутивах на основі Debian. Він піклується про керування залежностями та забезпечує хороший інтерфейс для операцій встановлення/оновлення/видалення.
Офіційний спосіб створення пакету включає багато кроків і процесів. У цій шпаргалці ми розглянемо простіший спосіб створення цих пакетів. Однак офіційний спосіб створення упаковки є ідеальним і рекомендованим для виробничих цілей.
Підготовка файлів
Структура пакета .deb
У дистрибутивах на основі Debian одним із способів встановлення програм є завантаження файлу пакета .deb і використання команди dpkg для його встановлення . Цей «пакет deb» — це архів двійкових і конфігураційних файлів, пов’язаних із програмним додатком. Усі файли всередині архіву зберігаються в певній структурі папок.
Під час інсталяції на цільовій машині двійкові файли та файли конфігурації переходять у подібну структуру папок із кореневої папки .
Ця інструкція про створення та інсталяцію власного debian пакету
Архітектури
Linux
| Architecture | Manufacturer | Status | Comments |
|---|---|---|---|
| all | - | Supported | - |
| Alpha | HPe (formerly HP, Compaq, Digital) | Unofficial | |
| Arm | Hundreds | Dead | NetWinder, NSLU2, … |
| Armel | Hundreds | Supported | QNAP, ?SheevaPlug, Raspberry Pi 1 |
| armhf | Hundreds | Supported | Arm v7 32-bit systems; for kernel support see DebianKernel/ARMMP |
| arm64 | Hundreds | Supported | Arm v8 64-bit systems |
| hppa | HPe (formerly HP) | Unofficial | HP Precision Architecture |
| i386 | Intel, AMD, Cyrix, NSC, Transmeta, VIA | Supported | The original x86 platform. Now requires “686” class CPU. |
| amd64 | AMD, Intel, VIA | Supported | also known as em64t or x86-64. |
| ia64 | Intel, HPe | Dead | Itanium (not Intel Core series) |
| m68k | Freescale (formerly Motorola) | Unofficial | Amiga, !AtariST, very old Macintoshes, some old Sun hardware (sun3) |
| mips | Cavium, Wave Computing (formerly Imagination, MIPS) | Dead | Big-endian 32-bit |
| mipsel | Cavium, Loongson, Wave Computing (formerly Imagination, MIPS) | Dead | Little-endian 32-bit |
| mips64el | Cavium, Loongson, Wave Computing (formerly Imagination, MIPS) | Supported | Little-endian 64-bit |
| PowerPC | IBM, Freescale (formerly Motorola) | Unofficial | Old Macintoshes |
| PowerSPE | IBM, Freescale (formerly Motorola) | Dead | IBM “e500” cores |
| PPC64 | IBM, Freescale (formerly Motorola) | Unofficial | Old Macintoshes, IBM POWER systems |
| ppc64el | IBM | Supported | POWER8, POWER9 systems |
| riscv64 | ?SiFive, etc. | Unofficial | |
| s390 | IBM | Dead | BigIron - IBM mainframe platform |
| s390x | IBM | Supported | Newer BigIron - IBM mainframe platform |
| SH4 | Renesas (formerly Hitachi) | Unofficial | |
| sparc64 | Sun, Fujitsu, etc. | Unofficial | |
| x32 | AMD, Intel, VIA | Unofficial | 32-bit ABI using x86-64 (amd64) ISA. |
non-Linux
| Architecture | Manufacturer | Status | Comments |
|---|---|---|---|
| hurd-i386 | see TheHurd | Unofficial | Not a hardware platform |
| hurd-amd64 | see TheHurd | Unofficial | Not a hardware platform |
| netbsd-i386 | NetBSD kernel | Dead | Not a hardware platform |
| netbsd-alpha | NetBSD kernel | Dead | Not a hardware platform |
| kfreebsd-i386 | FreeBSD kernel | Dead | Not a hardware platform |
| kfreebsd-amd64 | FreeBSD kernel | Dead | Not a hardware platform |