Fon jarayonlar — &, jobs, nohup, tmux
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) raqami4521— 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.outfayliga 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 ishlaydidisown— 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