Fon jarayonlar — &, jobs, nohup, tmux

~12 daq · Linux · Jarayonlar va tizim

Muammodan boshlaylik

Serverga SSH orqali ulandingiz va uzoq ishlaydigan buyruqni boshladingiz — 2 soatlik ma'lumotlar importi:

node import.js

30 daqiqadan keyin Wi-Fi uzildi. Qayta ulandingiz — import to'xtagan. Yarmi bazada, yarmi yo'q.

Yoki: npm run dev ni ishga tushirdingiz va terminal band — boshqa buyruq yozib bo'lmaydi.

Bu darsda — jarayonlarni fonda ishga tushirish va ularni terminal yopilganda ham "tirik" saqlash.


Old va fon

Oddiy buyruq old fonda (foreground) ishlaydi: terminal u tugaguncha band.

& — buyruqni fonda (background) ishga tushirish:

sleep 300 &
[1] 4521
  • [1] — job (vazifa) raqami
  • 4521 — PID

Terminal darhol bo'shaydi.

npm run build > build.log 2>&1 &

[!TIP] Fon jarayonining chiqishini faylga yo'naltiring — aks holda u ishlayotgan terminalingizga aralashib chiqib turadi.


Job boshqaruvi

jobs
[1]-  Running                 sleep 300 &
[2]+  Running                 npm run build > build.log 2>&1 &
Buyruq / tugma Nima
buyruq & Fonda boshlash
Ctrl + Z Old fondagini pauza qilish
bg Pauzadagini fonda davom ettirish
fg Fondagini old fonga qaytarish
fg %2 2-job ni old fonga
kill %1 1-job ga SIGTERM
jobs -l PID lar bilan

Tipik holat: buyruqni & siz boshladingiz, u uzoq ishlayotganini tushundingiz:

node import.js
# ... Ctrl+Z
[1]+  Stopped                 node import.js
bg          # fonda davom etadi
jobs        # [1]+ Running

Muammo: terminal yopilsa

& bilan ishga tushirilgan jarayon baribir terminalga bog'langan. Terminal (yoki SSH sessiyasi) yopilganda shell barcha job larga SIGHUP yuboradi (23-dars) — va ular to'xtaydi.

nohup — SIGHUP ga immunitet

nohup node import.js > import.log 2>&1 &
  • nohup — jarayon SIGHUP ni e'tiborsiz qoldiradi
  • Chiqish yo'naltirilmasa — nohup.out fayliga yoziladi

Endi SSH uzilsa ham import davom etadi. Keyin qayta ulanib:

tail -f import.log
pgrep -a node

disown — allaqachon ishlayotganni ajratish

nohup siz boshlagan bo'lsangiz:

node import.js > import.log 2>&1 &
disown %1

Job shell ro'yxatidan chiqariladi — terminal yopilganda SIGHUP olmaydi.


tmux — uzilmaydigan terminal sessiyalari

nohup — bitta buyruq uchun. Lekin ko'pincha kerak bo'lgani — butun terminal sessiyasi: uzilsangiz, qayta ulanasiz va hamma narsa — ochiq oynalar, ishlayotgan buyruqlar, tarix — joyida.

tmux (terminal multiplexer) aynan shuni qiladi:

sudo apt install tmux
tmux new -s import

Endi siz tmux sessiyasi ichidasiz. Uzoq buyruqni boshlang:

node import.js

Ajralish (detach): Ctrl+B, keyin D. Sessiya fonda ishlashda davom etadi. SSH ni yopishingiz, kompyuterni o'chirishingiz mumkin.

Keyinroq qayta ulanib:

tmux ls                       # sessiyalar ro'yxati
tmux attach -t import         # qaytish

Hammasi joyida — import ishlayapti, chiqish ko'rinib turibdi.

tmux asosiy tugmalari

Barcha tugmalar — avval Ctrl+B (prefiks), keyin:

Tugma Nima
d Ajralish (detach)
c Yangi oyna (window)
n / p Keyingi / oldingi oyna
0–9 N-oynaga
% Ekranni vertikal bo'lish
" Ekranni gorizontal bo'lish
strelkalar Bo'laklar orasida o'tish
x Joriy bo'lakni yopish
[ Varaqlash rejimi (q — chiqish)

Tipik ish oqimi: bitta tmux sessiyasida chapda tail -f app.log, o'ngda buyruqlar, alohida oynada htop.

[!TIP] Serverda uzoq ishlaydigan har qanday qo'lda bajariladigan ish (migratsiya, import, katta yangilanish) — har doim tmux ichida. Bu odat sizni ko'p muammolardan qutqaradi.

Alternativa: screen — eskiroq, lekin ko'p serverlarda o'rnatilgan.


Qaysi biri qachon

Vaziyat Vosita
Terminalni bo'shatish, qisqa vaqtga buyruq &
Bir martalik uzoq buyruq, natijasi faylga nohup ... &
Interaktiv uzoq ish, qayta ulanish kerak tmux
Doimiy ishlaydigan xizmat (veb-server, API) systemd (keyingi dars)

[!WARNING] Production ilovani nohup node server.js & bilan ishga tushirmang. Server qayta yuklansa — ilova ishga tushmaydi; qulasa — hech kim qayta ishga tushirmaydi; loglar tartibsiz. Xizmatlar uchun — systemd.


Nima uchun shunday?

Nima uchun terminal yopilganda jarayonlar to'xtaydi — bu noqulay emasmi?

Tarixiy sabab: "terminal" — haqiqiy jismoniy qurilma edi, telefon liniyasi orqali ulangan. Liniya uzilsa ("hang up" — SIGHUP nomi shundan) — foydalanuvchi ketgan, uning dasturlari egasiz qolgan va resurslarni behuda sarflaydi. Ularni avtomatik to'xtatish mantiqiy edi. Bugun ham bu standart xatti-harakat foydali: tasodifan qolib ketgan jarayonlar to'planmaydi. Uzoq yashashi kerak bo'lganlar esa buni aniq so'raydi — nohup, tmux yoki systemd orqali.


Xulosa

Eslab qoling:

  • buyruq & — fonda; jobs, fg, bg; Ctrl+Z — pauza
  • Terminal yopilsa — SIGHUP, fon job lar to'xtaydi
  • nohup buyruq > log 2>&1 & — terminal yopilsa ham ishlaydi
  • disown — allaqachon ishlayotganini ajratish
  • tmux: tmux new -s nom, Ctrl+B D — ajralish, tmux attach -t nom — qaytish
  • Serverdagi uzoq qo'lda ishlar — tmux ichida
  • Doimiy xizmatlar — systemd

Keyingi dars

25-dars: systemd — xizmatlar, systemctl, o'z xizmatingizni yozish