FreeBSD гарын авлага
Өмнөх | Бүлэг 3. Юниксийн үндэс | Дараах

# 3.8. Далд чөтгөр буюу дэмонууд, дохионууд, мөн процессуудыг зогсоох нь

Та хэрэв ямар нэг текст засварлагч дээр ажиллаж байхдаа файл нээх, хаах, хадгалах гэх мэт уг програмыг сайн хянаж чаддаг. Та яагаад тэгж чадаж байна вэ гэвэл, уг програм нь терминал дээр холбогдон ажиллаж танд тийм боломж олгож байгаа билээ. Зарим програм тэгэхэд үргэлж хүн гарнаас оруулалт хийх шаардлагагүй зориулалтаар бүтээгдсэн байдаг бөгөөд хамгийн эхний боломж гарангуут терминалаас салангид ажилладаг. Жишээлбэл вэб серверүүд өдөржин хүмүүсээс ирсэн хүсэлтэд хариулт өгч байдаг бөгөөд ердийн үед танаас оруулга шаарддаггүй. Ийм төрлийн бас нэг програм бол захиа илгээгч програм юм.

Бид ийм програмыг далд чөтгөр буюу дэмон гэж нэрлэдэг. Дэмонууд нь Грекийн домогт байдаг сайн муугийн аль нь ч биш бөгөөд жижигхэн мөртлөө хүмүүст хэрэгтэй юм хийж байдаг сүнсийг хэлдэг. Вэб сервер болон захианы серверүүд үүнтэй ижил хүмүүст тустай юм хийдэг. Тийм болохоор BSD нь спорт шаахайтай, жижигхэн, сэрээ барьсан чөтгөрийг олон жилээр дуртайяа өөрийнхөө билэг тэмдэг болгож байгаа билээ.

Далд ажиллаж байгаа буюу дэмон болж ажиллаж байгаа програмын нэрний ард “d” үсэг залгаж бичдэг зарчим бий. BIND програмын бүтэн нэр нь Berkeley Internet Name Daemon бөгөөд үндсэн далд ажилладаг програмын нэр нь `named`, мөн Apache вэб серверийн далд ажилладаг програмын нэр нь `httpd`, хэвлэх дарааллыг далд ажиллаж зохицуулж байдаг програмын нэр нь `lpd` гэх мэт нэртэй байдаг. Энэ нь ерөнхийдөө ингэж зарчим гаргасан болохоос хатуу тогтоосон дүрэм биш; жишээлбэл захиа илгээгч үндсэн програм Sendmail-н далд ажилладаг програмыг та `maild` гэж төсөөлж байгаа бол эндүүрэх бөгөөд харин `sendmail` гэж нэрлэдэг.

Заримдаа та эдгээр дэмон процессуудтай холбогдож харилцах хэрэг гарна. Ингэх нэг арга нь түүн рүү (эсвэл бусад ажиллаж байгаа процесс уруу) дохио гэгддэг зүйл илгээх явдал юм. Маш олон төрлийн илгээж болох дохионууд байдаг -- зарим дохионууд онцгой зориулалттай нийтэд нь хэрэгждэг, зарим нь тухайн програмдаа зориулж өөр өөрөөр хөрвүүлэгддэг бөгөөд програмын заавар дээр ямар дохиог яаж хөрвүүлэн ойлгох вэ гэдгийг заасан байдаг. Та өөрийнхөө эзэмшиж байгаа процесс уруугаа дохио илгээж болно. Хэрэв та бусдын эзэмшдэг процесс уруу kill(1) эсвэл kill(2) гэх зэрэг дохио илгээвэл таны эрх дутаж хэрэгждэггүй. Гэхдээ ийм эрхээр дутагддаггүй хэрэглэгч бол `root` хэрэглэгч бөгөөд хүн болгоны процесс уруу дохио илгээж чаддаг.

Мөн FreeBSD-ээс програм уруу зарим тохиолдолд дохио илгээдэг. Жишээлбэл, хэрэв муу зохиогдсон нэг програм санах ойг зориулсан хэмжээнээсээ илүү хэрэглээд эхэлбэл FreeBSD уг програм уруу Хэсгийн буруу хэрэглээ дохио илгээдэг (`SIGSEGV`). Мөн хэрэв ямар нэгэн програм нь alarm(3) гэдэг системийн сануулах програмыг ашигласан бол тухайн хугацаа нь хэтрэх үед Сэрүүлэг дохио уг програмд ирэх (`SIGALRM`) зэрэг олон дохио бий.

Процесийг зогсоох хоёр дохио байдаг, `SIGTERM` ба `SIGKILL` хоёр. `SIGTERM` нь арай эелдэг аргаар процессийг зогсоодог; процесс нь эхлээд дохиог хүлээж аваад өөрийг нь хаах гэж байгаад мэдээд нээлттэй байгаа бүртгэл бичлэг файлуудаа хаагаад тэгээд хийж байгаа ерөнхий үйлдлээ зогсоодог. Зарим тохиолдолд уг процесс нь таслагдаж болохооргүй үйлдэл хийж байх үедээ `SIGTERM` дохиог хэрэгсэхгүй байдал үүсдэг.

`SIGKILL` дохиог ямар ч процесс хэрэгсэхгүй байж чаддаггүй. Өөрөөр хэлбэл энэ нь “Чиний юу хийж байх нь надад хамаагүй, одоо шууд зогсоо” гэсэн дохио юм. Хэрэв та `SIGKILL` дохиог процесс уруу илгээвэл FreeBSD уг процессийг зогсоодог [1].

Таны хэрэглэж болохоор бусад дохионууд нь `SIGHUP`, `SIGUSR1`, мөн `SIGUSR2`. Эдгээр дохио нь ерөнхий зориулалтаар хэрэглэгддэг бөгөөд эдгээр дохиог хүлээж авсан програмууд тус тусдаа өөр өөр хариу үйлдэл хийдэг.

Жишээлбэл, та вэб серверийнхээ тохируулгын файлд өөрчлөлт хийгээд уг серверийг тохируулгын файлаа дахин шинээр уншуулахыг хүссэн гэж бодъё. Та `httpd` дэмоноо зогсоогоод дахин шинээр эхлүүлж болох боловч ажиллаж байгаа вэб серверийг зогсоож болохгүй нөхцөл байж болно. Ихэнх дэмонууд нь `SIGHUP` дохиог хүлээж авбал өөрийнхөө тохируулгынхаа файлыг уншина гэж тохируулагдсан байдаг. Тэгэхээр `httpd` дэмоноо зогсоогоод шинээр ачаалж байхын оронд `SIGHUP` дохиог илгээхэд хангалттай. Учир нь энэ дохионд тэгж хариулна гэсэн тогтоосон арга зам байхгүй тул дэмон болгон өөр өөр үйлчлэл үзүүлдгийг ойлгож тухайн дэмоны заавар бичгийг нь судлах хэрэгтэй.

дохио илгээхдээ kill(1) тушаалыг ашигладаг.

Процесс уруу дохио илгээх

Энэ жишээ нь inetd(8) уруу хэрхэн дохио илгээхийг харуулах болно. `inetd` -н тохируулгын файл `/etc/inetd.conf` гэж байрласан бөгөөд `inetd`-ийг тохируулгын файлаа дахин уншуулахын тулд `SIGHUP` дохиог илгээх болно.

1. Илгээх процессийн процесс ID дугаарыг мэдэх хэрэгтэй. Ингэхийн тулд ps(1) ба grep(1) тушаалуудыг ашиглана. grep(1) тушаал нь өмнөх тушаалынхаа гаралтаас хайлт хийхэд хэрэглэгддэг бөгөөд хайх мөрөө зааж өгдөг. Энэ тушаал нь энгийн хэрэглэгчээс гүйцэтгэгдэж болох бөгөөд харин inetd(8) програм нь `root` хэрэглэгчээр гүйцэтгэгдсэн тул ps(1) тушаалыг `ax` сонголттой цуг гүйцэтгэх ёстой.

       % ps -ax | grep inetd
         198  ??  IWs    0:00.00 inetd -wW

   За тэгэхээр, inetd(8)-ийн PID дугаар нь 198 гэж энэ тохиолдолд хэлж байна. Зарим тохиолдолд `grep inetd` гэсэн тушаал нь өөрөө энэ гаралтад байж байдаг. Учир нь, ps(1) програм нь уг тушаалыг ажиллуулж байгаа процессийг олсон үед тэгж гаргаж харуулдаг.

2. kill(1) тушаалыг хэрэглэж дохио илгээнэ. inetd(8) нь `root` хэрэглэгчээр гүйцэтгэгдэж байгаа болохоор, та эхлээд su(1) тушаалыг ашиглан `root` хэрэглэгч болох хэрэгтэй.

       % su
       Password:
       # /bin/kill -s HUP 198

   Ихэнх UNIX® системийн тушаалуудын адил, kill(1) тушаал нь хэрэв амжилттай хэрэгжвэл ямар нэгэн төлвийн мэдээлэл харуулдаггүй. Хэрэв та өөрийнхөө эзэмшдэггүй процесс уруу дохио илгээвэл “`kill: `PID`: Operation not permitted`” буюу энэ үйлдлийг хийх эрх байхгүй байна гэсэн мэдэгдэл гарч ирнэ. Хэрэв та PID дугаараа буруу бичих, эсвэл буруу процесс уруу дохио илгээвэл, азгүй тохиолдолд уг дохио нь тухайн процесс уруу илгээгдэх бөгөөд, уг процесс нь азаар байхгүй байгаа тохиолдолд “`kill: `PID`: No such process`” буюу тийм процесс алга байна гэсэн мэдэгдэл гарч ирнэ.

   > Яагаад `/bin/kill` тушаалыг хэрэглэх хэрэгтэй вэ?: Ихэнх shells буюу бүрхүүлүүд `kill` тушаалыг өөртөө агуулсан байдаг бөгөөд `/bin/kill` тушаалыг бичихийн оронд шууд бүрхүүлд буй тушаалыг нь гүйцэтгэх нь шулуухан байдаг. Энэ нь амарчилсан ашигтай арга боловч бүрхүүл болгон өөрсдийн илгээх дохионы өөр өөр нэртэй байдгийг мэдэх хэрэгтэй. Тийм болохоор бүрхүүл болгоны дохионы бичлэгийг судлахын оронд шууд `/bin/kill `...`` тушаалыг хэрэглэх нь зөв арга юм.

Бусад дохио илгээх үйлдлүүд нь үүнтэй тун ижил бөгөөд `TERM` эсвэл `KILL` дохионуудын оронд шаардлагатай дохиогоо бичих хэрэгтэй.

> Чухал: Санаанд орсон тоотой дохио болгоныг устгана гэдэг бол буруу санаа юм. init(8) процесс ялангуяа 1 гэсэн процесс ID байх нь онцгой тохиолдол. Тийм болохоор `/bin/kill -s KILL 1` гэвэл системийг шууд унтраана. kill(1) тушаалыг гүйцэтгэхээсээ өмнө Return товч дарахынхаа өмнө үргэлж ямар процесс уруу ямар дохио илгээж байгаагаа давхар шалгах хэрэгтэй.

### Тайлбар

[1] | Бас тэр чигээрээ үнэн биш--учир нь зарим таслагдаж болдоггүй нөхцлүүд байдаг. Жишээлбэл, хэрэв сүлжээнд байгаа компьютерийн нэг файлаас унших үйлдэл хийж байгаа процесс нь, хэрэв холбогдсон компьютер нь тодорхойгүй шалтгаанаар холбогдохгүй болох үед (цахилгаан тэжээлээс салгагдах, эсвэл сүлжээ эвдрэх), уг процесс нь “тасрахгүй” нөхцөлд байдаг. Магадгүй хэсэг хугацааны дараа хүлээх хугацаа нь дуусна. Ингэж хүлээх хугацаа нь дууссаны дараа л уг процесс зогсох болно.

Өмнөх | Эхлэл | Дараах
Процесс буюу програмын явц | Дээш | Shell буюу бүрхүүл

Энэ болон бусад баримтуудыг ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/ хаягаас татаж авч болно.

FreeBSD-ийн талаар <questions@FreeBSD.org> хаягтай холбоо барихаасаа өмнө баримтыг уншина уу.
Энэ бичиг баримттай холбоотой асуулт байвал <doc@FreeBSD.org> хаягаар цахим захидал явуулна уу.
Энэ бичиг баримтын орчуулгатай холбоотой асуулт байвал <admin@mnbsd.org> хаягаар цахим захидал явуулна уу.