Wakasan ang isang proseso sa Linux - ps, kill at killall command. Pagbabago ng PID ng isang proseso sa Linux gamit ang isang kernel module

Sa artikulong ito, susubukan naming lumikha ng kernel module na maaaring baguhin ang PID ng isang tumatakbo nang proseso sa Linux, at mag-eksperimento rin sa mga prosesong nakatanggap ng binagong PID.


Babala: Ang pagpapalit ng PID ay isang hindi karaniwang proseso, at sa ilalim ng ilang mga pangyayari ay maaaring humantong sa isang kernel panic.

Ipapatupad ng aming test module ang /dev/test character device, na magbabago sa PID ng proseso kapag nagbabasa mula dito. Salamat sa artikulong ito para sa isang halimbawa ng pagpapatupad ng isang character na device. Ang buong code ng module ay ibinibigay sa dulo ng artikulo. Siyempre, ang pinakatamang solusyon ay ang magdagdag ng system call sa kernel mismo, ngunit ito ay mangangailangan ng muling pag-compile ng kernel.

Kapaligiran

Ang lahat ng mga aktibidad sa pagsubok ng module ay isinagawa sa isang VirtualBox virtual machine na may 64-bit na pamamahagi ng LInux at kernel na bersyon 4.14.4-1. Ang komunikasyon sa makina ay isinagawa gamit ang SSH.

Subukan ang #1 simpleng solusyon

Ang ilang mga salita tungkol sa kasalukuyang: ang kasalukuyang variable ay tumuturo sa isang task_struct na istraktura na may paglalarawan ng proseso sa kernel (PID, UID, GID, cmdline, namespaces, atbp.)

Ang unang ideya ay baguhin lamang ang kasalukuyang->pid na parameter mula sa kernel module patungo sa ninanais.

Static ssize_t device_read(struct file *filp, char *buffer, size_t length, loff_t * offset) ( printk("PID: %d.\n",current->pid); current->pid = 1; printk("bago PID: %d.\n",kasalukuyang->pid); , )
Upang suriin ang pag-andar ng module, sumulat ako ng isang programa sa C++:

#isama #isama #isama int main() ( std::cout<< "My parent PID " << getppid() << std::endl; std::cout << "My PID " << getpid() << std::endl; std::fstream f("/dev/test",std::ios_base::in); if(!f) { std::cout << "f error"; return -1; } std::string str; f >>str; std::cout<< "My new PID " << getpid() << std::endl; execl("/bin/bash","/bin/bash",NULL); }
I-load natin ang module gamit ang insmod command, lumikha ng /dev/test at subukan ito.

# ./a.out Aking magulang PID 293 Aking PID 782 Aking bagong PID 782
Hindi nagbago ang PID. Maaaring hindi lamang ito ang lugar kung saan tinukoy ang PID.

Subukan ang #2 karagdagang mga field ng PID

Kung ang current->pid ay hindi ang process identifier, ano ito? Isang mabilis na pagtingin sa getpid() code na itinuro sa isang task_struct structure na naglalarawan sa proseso ng Linux at pid.c file sa kernel source code. Ang kinakailangang function ay __task_pid_nr_ns. Sa function code ay mayroong call task->pids.pid, babaguhin natin ang parameter na ito

I-compile at subukan

Dahil sinubukan ko sa pamamagitan ng SSH, nakuha ko ang output ng programa bago nag-crash ang kernel:

Aking magulang PID 293 Aking PID 1689 Aking bagong PID 1689
Ang unang resulta ay isang bagay na. Ngunit ang PID ay hindi pa rin nagbabago.

Subukan ang #3 na hindi na-export na mga simbolo ng kernel

Ang isang mas malapit na pagtingin sa pid.c ay nagbunga ng isang function na gumagawa ng kung ano ang kailangan namin
static void __change_pid(struct task_struct *task, enum pid_type type,
struct pid *bago)
Tumatanggap ang function ng isang gawain kung saan kinakailangang baguhin ang PID, ang uri ng PID at, sa katunayan, ang bagong PID. Lumilikha ang function ng isang bagong PID
struct pid *alloc_pid(struct pid_namespace *ns)

Ang function na ito ay tumatanggap lamang ng namespace kung saan ang bagong PID ay maninirahan, ang puwang na ito ay maaaring makuha gamit ang task_active_pid_ns .
Ngunit may isang problema: ang mga simbolo ng kernel na ito ay hindi na-export ng kernel at hindi magagamit sa mga module. Isang kahanga-hanga ang tumulong sa akin sa paglutas ng problemang ito. Ang find_sym function code ay kinuha mula doon.

Static asmlinkage void (*change_pidR)(struct task_struct *task, enum pid_type type, struct pid *pid); static na asmlinkage struct pid* (*alloc_pidR)(struct pid_namespace *ns); static int __init test_init(void) ( printk(KERN_ALERT "TEST driver load!\n"); change_pidR = find_sym("change_pid"); alloc_pidR = find_sym("alloc_pid"); ... ) static ssize_t device_read(struct file * filp, char *buffer, size_t length, loff_t * offset) ( printk("PID: %d.\n",current->pid); struct pid* newpid; newpid = alloc_pidR(task_active_pid_ns(current)); change_pidR(current ,PIDTYPE_PID,newpid printk("bagong PID: %d.\n",kasalukuyang->pid ... )
I-compile, ilunsad

Aking magulang PID 299 Aking PID 750 Aking bagong PID 751
Nagbago ang PID! Ang kernel ay awtomatikong naglaan ng libreng PID sa aming programa. Ngunit posible bang gumamit ng PID na inookupahan ng isa pang proseso, tulad ng PID 1? Idagdag natin ang code pagkatapos ng alokasyon

Newpid->numero.nr = 1;
I-compile, ilunsad

Aking magulang PID 314 Aking PID 1172 Aking bagong PID 1
Nakakakuha kami ng totoong PID 1!

Ang Bash ay naghagis ng isang bug na pumipigil sa paglipat ng gawain gamit ang %n command mula sa paggana, ngunit lahat ng iba pang mga function ay gumagana nang maayos.

Mga kagiliw-giliw na tampok ng mga proseso na may binagong PID

PID 0: hindi maka-log in

Bumalik tayo sa code at baguhin ang PID sa 0.

Newpid->numbers.nr = 0;
I-compile, ilunsad

Aking magulang PID284 Aking PID 1517 Aking bagong PID 0
Kaya ang PID 0 ay hindi ganoon kaespesyal? Kami ay nagagalak, sumulat ng paglabas at...

Ang cannonball ay bumabagsak! Tinukoy ng kernel ang aming gawain bilang IDLE TASK at, nang makita ang pagkumpleto, nag-crash lang. Tila, ang aming programa ay dapat bumalik sa "normal" nitong PID bago lumabas.

Hindi nakikitang proseso

Bumalik tayo sa code at magtakda ng PID na garantisadong hindi magiging abala
newpid->numbers.nr = 12345;

I-compile, ilunsad

Aking magulang PID296 Aking PID 735 Aking bagong PID 12345
Tingnan natin kung ano ang nasa /proc

1 148 19 224 288 37 79 86 93 consoles fb kcore lock partition swaps version 10 149 2 226 29 4 8 87 acpi cpuinfo filesystems key-users meminfo sched_debug sys vmallocinfo 2008 2008 kripto mga key misc schedstat sysrq- trigger vmstat 11 16 208 24 291 6 81 89 buddyinfo na mga device ay nakakaabala sa mga module ng kmsg scsi sysvipc zoneinfo 12 17 21 25 296 7 82 9 bus diskstats iomem kpagecgroup mounts self-thread-self 13 0726 s kpagecount mtrr slabinfo timer_list 139 18 22 27 30 76 84 91 cmdline driver irq kpageflags net softirqs tty 14 182 222 28 31 78 85 92 config.gz execdomains kallsyms loadavg pagetypeinfo stat uptime
Gaya ng nakikita natin, hindi tinutukoy ng /proc ang ating proseso, kahit na sinakop natin ang isang libreng PID. Ang nakaraang PID ay wala din sa /proc, at ito ay lubhang kakaiba. Marahil kami ay nasa ibang namespace at samakatuwid ay hindi nakikita ng main /proc. Mag-mount tayo ng bagong /proc at tingnan kung ano ang naroon

2 83 92 cmdline dma iomem kmsg misc sched_debug swaps uptime 11 15 2 224 28 37 78 84 93 config.gz driver ioports kpagecgroup modules schedstat sys version 12 16 20 226 288 4 79 85 acpi consoles execcounts irqpage 208 23 29 6 8 86 tunog cpuinfo fb ​​​​kallsyms kpageflags mtrr self sysvipc vmstat 139 176 21 24 290 7 80 87 buddyinfo crypto filesystems kcore loadavg net slabinfo thread-self zoneinfo
Ang aming proseso ay wala pa rin, na nangangahulugang kami ay nasa normal na namespace. Suriin natin

Ps -e | grep bash
296 pts/0 00:00:00 bash

Isang bash lang, kung saan namin inilunsad ang programa. Wala sa listahan ang nakaraang PID o ang kasalukuyan.

Sa palagay mo ba ang Linux operating system ay maaaring awtomatikong pangalagaan ang sarili nito? Kapag ang lahat ay gumagana nang maayos o hindi mo kailangan ng anumang hindi karaniwang mga tampok, oo. Ngunit kung minsan ang iyong interbensyon sa kanyang trabaho ay maaaring kailanganin.

Sa Linux, ang isang proseso ay nilikha para sa bawat indibidwal na programa kapag nagsimula ito. Hindi mahalaga kung ikaw mismo ang magpapatakbo ng program o kung ang system o kernel ang gumagawa nito. Halimbawa, ang programa sa pagsisimula, na tumatakbo kaagad pagkatapos ma-load ang kernel, ay mayroon ding sariling proseso na may ID 0. Ang mga proseso sa Linux ay maaaring ilarawan bilang mga lalagyan kung saan ang lahat ng impormasyon tungkol sa estado at pagpapatupad ng programa ay naka-imbak. Kung ang programa ay gumagana nang maayos, kung gayon ang lahat ay maayos, ngunit kung ito ay nag-freeze o kailangan mong ayusin ang trabaho nito, maaaring kailanganin mo ang pamamahala ng proseso sa Linux.

Sakop ng artikulong ito ang isang malawak na paksa at titingnan natin ang mga sumusunod na posibilidad:

  • Tingnan ang mga tumatakbong proseso
  • Pagtingin sa impormasyon ng proseso
  • Paghahanap ng mga proseso sa Linux
  • Pagbabago ng Priyoridad ng Proseso
  • Pagwawakas ng mga proseso
  • Nililimitahan ang memorya na magagamit sa isang proseso

Hindi ko maiwasang isama ang mga unang punto sa artikulo, ngunit ang mga ito ay napaka-simple at hindi namin tatalakayin ang mga ito nang detalyado. Ngunit ang lahat ng iba pa ay maaaring mukhang kumplikado at hindi sapat na inilarawan.

Magsimula tayo sa pamamagitan ng pag-unawa sa mga tuntunin. Mahalaga, isang proseso ang bawat programa. Tulad ng nasabi ko na, isang hiwalay na proseso ang nilikha para sa bawat inilunsad na programa. Bilang bahagi ng isang proseso, ang isang programa ay inilalaan ng oras ng CPU, RAM, at iba pang mapagkukunan ng system. Ang bawat proseso ay may sariling identifier, Process ID o simpleng PID, at ang mga proseso ng Linux ay kadalasang nakikilala nila. Ang PID ay hindi random na tinutukoy; gaya ng sinabi ko na, ang programa sa pagsisimula ay tumatanggap ng PID 1, at ang bawat kasunod na inilunsad na programa ay tumatanggap ng isa pa. Kaya, ang PID ng mga programa ng gumagamit ay umabot sa ilang libo.

Sa katunayan, ang mga proseso ng Linux ay hindi kasing-abstract ng tila sa iyo ngayon. Maaari mong subukang maramdaman ang mga ito. Buksan ang iyong file manager, pumunta sa root directory, pagkatapos ay buksan ang /proc folder. Tingnan ang isang grupo ng mga numero dito? Kaya ito lang - ang PID ng lahat ng tumatakbong proseso. Ang bawat isa sa mga folder na ito ay naglalaman ng lahat ng impormasyon tungkol sa proseso.

Halimbawa, tingnan natin ang folder ng proseso 1. Ang folder ay naglalaman ng iba pang mga subdirectory at maraming mga file. Ang cmdline file ay naglalaman ng impormasyon tungkol sa proseso ng paglunsad ng command:

pusa /proc/1/cmdline

/usr/lib/systemd/systemd

Dahil ginagamit ko ang Systemd initialization system, ang unang proseso ay inilunsad para dito. Magagawa mo ang lahat gamit ang /proc na direktoryo. Ngunit ito ay napaka-inconvenient, lalo na kung isasaalang-alang ang bilang ng mga tumatakbong proseso sa system. Samakatuwid, may mga espesyal na kagamitan upang ipatupad ang mga kinakailangang gawain. Magpatuloy tayo upang isaalang-alang ang mga utility na nagbibigay-daan sa iyong ipatupad ang pamamahala ng proseso sa Linux.

Pamamahala ng Proseso sa Linux

Ang Linux ay may napakalaking bilang ng mga utility para sa paglutas ng iba't ibang mga gawain sa pamamahala ng proseso. Kabilang dito ang mga multifunctional na solusyon tulad ng htop, top, pati na rin ang mga simpleng utility, halimbawa, ps, kill, killall, who, etc. Hindi ko isasaalang-alang ang mga graphical na utility sa artikulong ito, at hindi ko rin isasaalang-alang ang top. Yung una kasi sobrang simple, yung pangalawa kasi mas maganda yung htop. Kami ay tumutuon sa pagtatrabaho sa htop program at ang mga analogue nito sa anyo ng mga utility na istilo ng GNU, isang utility - isang function.

I-install natin ang htop kung hindi mo pa ito na-install. Sa Ubuntu ito ay ginagawa tulad nito:

sudo apt install htop

Sa ibang mga distribusyon kailangan mo lang gamitin ang iyong manager ng package. Ang pangalan ng package ay pareho.

Tingnan ang mga tumatakbong proseso

Ito ay isang napaka-simpleng gawain, at madali rin itong lutasin. Mayroong maraming mga kagamitan para dito, mula sa karaniwang ps hanggang sa mas advanced na interactive na tuktok, htop at iba pa.

Pagbukas ng htop, agad naming nakikita ang isang listahan ng mga tumatakbong proseso. Siyempre, hindi lahat ng mga proseso ng Linux ay ipinapakita dito, maraming mga ito sa system, alam mo na ang lahat ng mga ito ay hindi magkasya sa isang screen. Bilang default, ang mga prosesong tumatakbo bilang iyong user ay ipinapakita:

Maaari mong makita ang sumusunod na impormasyon tungkol sa proseso:

  • PID- identifier ng proseso
  • USER- ang user kung saan inilunsad ang proseso
  • PRI- Priyoridad ng proseso ng linux sa antas ng kernel (karaniwan ay NI+20)
  • NI- priyoridad sa pagpapatupad ng proseso mula -20 hanggang 19
  • S- estado ng proseso
  • CPU- Ginagamit ang mga mapagkukunan ng CPU
  • MEM- ginamit na memorya
  • ORAS- oras ng pagpapatakbo ng proseso

Maaari kang magdagdag ng mga karagdagang parameter sa display, ngunit ito ang mga pangunahing. Maaari kang magdagdag ng mga parameter gamit ang Setup menu. Ang lahat ay napaka-simple doon, basahin ang mga tip at sundin ang mga direksyon. Halimbawa, ang parameter ng PPID ay naidagdag:

Ang isang napakahalagang tampok ng programa ay na maaari mong ayusin ang mga proseso sa Linux ayon sa nais na parameter. I-click lamang ang pangalan ng parameter, ito ay i-highlight sa berde at pag-uuri ay isasagawa. Halimbawa, kung gusto mong makita kung anong pagkakasunud-sunod ang inilunsad ang mga proseso, pag-uri-uriin ayon sa PID:

Mayroon ding isang kagiliw-giliw na pagpipilian upang ayusin ang mga proseso sa isang puno. Magagawa mong makita kung aling proseso ang nagsimula ng isang partikular na proseso. Upang ipakita ang puno, pindutin ang F5 button:

Maaari kang magsagawa ng halos parehong mga aksyon gamit ang ps program. Dito lamang walang ganoong maginhawang interactive na mode. Ginagawa ang lahat gamit ang mga pagpipilian.

Tingnan natin ang mga pangunahing opsyon na gagamitin natin:

  • -e- ipakita ang impormasyon tungkol sa lahat ng mga proseso
  • -a- ipakita ang impormasyon tungkol sa lahat ng pinakamadalas na hinihiling na proseso
  • -t- ipakita lamang ang mga proseso mula sa terminal na ito
  • -p- ipakita lamang ang impormasyon tungkol sa tinukoy na proseso
  • -u- ipakita ang mga proseso ng isang partikular na user lamang

Sa madaling salita, upang tingnan ang lahat ng kasalukuyang aktibong proseso sa Linux, gumamit ng kumbinasyon ng mga opsyon sa aux:

Ipinapakita ng programa ang lahat ng parehong mga parameter, tanging walang interactive na interface. Sa tingin mo imposibleng pagbukud-bukurin ang mga proseso dito, ngunit nagkakamali ka, posible ito. Mayroong isang pagpipilian sa pag-uuri para dito. Maaari mong ayusin ang mga ito ayon sa anumang field, halimbawa:

ps aux --sort=%mem

Ang listahan ay pag-uuri-uriin sa reverse order, na may mas maraming value sa ibaba at mas mababa sa itaas. Kung kailangan mong gawin ito nang baligtad, magdagdag ng minus:

ps aux --sort=-%cpu

Maaaring gamitin ang mga priyoridad sa proseso ng Linux o anumang iba pang parameter bilang field ng pag-uuri. Maaari mo ring i-trim ang output kung hindi mo kailangang ipakita ang lahat ng impormasyon:

Mukhang walang kakayahan ang ps na mag-cost process ng mga puno. Ngunit hindi talaga, mayroong isang hiwalay na utos para dito:

Paghahanap ng mga proseso sa Linux

Ang isang listahan ng mga proseso ay mabuti. Ngunit kung minsan, kapag ang ilang proseso ay nagyelo at kailangan nating patayin ang proseso ng Linux o kailangan nating magsagawa ng ilang mga aksyon kasama nito, kailangan nating piliin ang prosesong ito mula sa listahan, alamin ang PID nito at impormasyon tungkol dito.

Upang mahanap ang proseso ng linux sa htop maaari mong gamitin ang F3 button. Pindutin ang F3 at i-type ang nais na salita. Susunod, upang lumipat sa susunod na entry, pindutin ang F2 o Esc upang kumpletuhin ang paghahanap:

Maaari mo ring gamitin ang htop filter upang maghanap ng mga proseso sa htop. Pindutin ang F4, magpasok ng isang salita, at tanging ang mga proseso ng linux na ang pangalan ay kasama ang salitang iyon ang ililista.

Walang pag-filter sa ps utility, ngunit maaari naming gamitin ang grep utility, i-redirect ang output ng ps dito upang mahanap ang proseso ng linux:

ps aux | grep chromium

Ito ay isang karaniwang ginagamit na utos.

Pagbabago ng Priyoridad ng Proseso

Nangangahulugan ang priyoridad ng proseso ng Linux kung gaano karaming oras ng CPU ang ibibigay sa prosesong iyon kumpara sa iba. Sa paraang ito, maaayos natin kung aling programa ang tatakbo nang mas mabilis at alin ang tatakbo nang mas mabagal. Ang halaga ng priyoridad ay maaaring mula sa 19 (minimum na priyoridad) hanggang -20 - pinakamataas na priyoridad ng proseso ng linux. Bukod dito, maaari mong bawasan ang priyoridad sa mga karapatan ng isang regular na user, ngunit upang madagdagan ito kailangan mo ng mga karapatan ng superuser.

htop ay gumagamit ng Nice parameter upang kontrolin ang priyoridad. Ipaalala ko sa iyo na ang Priv ay isang pag-amyenda lamang, sa karamihan ng mga kaso ito ay 20 higit pa sa Nice Upang baguhin ang priyoridad ng isang proseso, ilagay lamang ang cursor dito at pindutin ang F7 upang bawasan ang numero (dagdagan ang priyoridad) o F8 sa. dagdagan ang bilang.

Ngunit upang malutas ang gawaing ito ng pamamahala ng mga proseso ng Linux, hindi kinakailangan na gumamit ng htop. Magagawa mo ang lahat sa iba pang mga utos. Halimbawa, ang magandang utos. Gamit ito, maaari mong tukuyin ang priyoridad para sa prosesong ilulunsad:

maganda -n 10 apt-get upgrade

O baguhin ang priyoridad para sa isang umiiral na sa pamamagitan ng pid nito:

renice -n 10 -p 1343

Pagwawakas ng mga proseso sa Linux

Kung ang isang proseso ay nagyelo at hindi tumutugon, dapat itong wakasan. Sa htop, upang patayin ang isang proseso ng Linux, ilagay lamang ang cursor sa proseso at pindutin ang F9:

Gumagamit ang system ng ilang mga signal upang kontrolin ang mga proseso; Narito ang ilang pangunahing senyales:

  • SIGKILL- tanungin ang proseso upang i-save ang data at tapusin
  • SIGTERM- tapusin kaagad ang proseso, nang hindi nagse-save

Sa pangkalahatan, mayroong ilang dosenang signal, ngunit hindi namin isasaalang-alang ang mga ito. Ipadala natin ang signal ng SIGKILL:

Maaari mo ring gamitin ang kill utility:

Maaari mo ring patayin ang isang proseso sa pamamagitan ng pangalan:

pumatay ng chromium

Limitasyon sa Proseso

Ang pamamahala ng proseso sa Linux ay nagpapahintulot sa iyo na kontrolin ang halos lahat. Nakita mo na kung ano ang maaaring gawin, ngunit higit pa ang magagawa. Gamit ang ulimit command at ang /etc/security/limits.conf configuration file, maaari mong limitahan ang access ng mga proseso sa mga mapagkukunan ng system tulad ng memorya, mga file, at ang processor. Halimbawa, maaari mong limitahan ang memorya ng proseso ng Linux, bilang ng mga file, atbp.

Ang entry sa file ay ganito ang hitsura:

<домен> <тип> <элемент> <значение>

  • domain- user name, pangalan ng grupo o UID
  • uri- uri ng mga paghihigpit - malambot o matigas
  • elemento- isang mapagkukunan na magiging limitado
  • ibig sabihin- kinakailangang limitasyon

Ang mga hard limit ay itinakda ng superuser at hindi mababago ng mga regular na user. Ang mga soft limit ay maaaring baguhin ng mga user gamit ang ulimit command.

Tingnan natin ang mga pangunahing paghihigpit na maaaring ilapat sa mga proseso:

  • nofile
  • bilang- maximum na halaga ng RAM
  • salansan- maximum na laki ng stack
  • CPU- maximum na oras ng processor
  • nproc- maximum na bilang ng mga core ng processor
  • mga kandado- bilang ng mga naka-block na file
  • maganda- pinakamataas na priyoridad ng proseso

Halimbawa, limitahan natin ang oras ng processor para sa mga proseso ng user na si sergiy:

sergiy mahirap nproc 20

Maaari mong tingnan ang mga paghihigpit para sa isang partikular na proseso sa proc folder:

pusa /proc/PID/limits

Ang maximum na oras ng cpu ay walang limitasyong walang limitasyong mga segundo
Ang maximum na laki ng file ay walang limitasyong walang limitasyong mga byte
Ang maximum na laki ng data ay walang limitasyong walang limitasyong mga byte
Max na laki ng stack 204800 walang limitasyong byte
Max core file size 0 unlimited bytes
Ang max na residente ay nagtakda ng walang limitasyong walang limitasyong mga byte
Max na proseso 23562 23562 proseso
Max open file 1024 4096 file
Max na naka-lock na memorya 18446744073708503040 18446744073708503040 bytes
Max address space walang limitasyong walang limitasyong byte
Ang max na file ay nagla-lock ng walang limitasyong walang limitasyong mga kandado
Max na nakabinbing signal 23562 23562 signal
Max na laki ng msgqueue 819200 819200 bytes
Max magandang priyoridad 0 0
Max realtime na priyoridad 0 0
Max realtime timeout unlimited unlimited sa amin

Ang mga paghihigpit na binago sa ganitong paraan ay magkakabisa pagkatapos ng pag-reboot. Ngunit maaari rin tayong magtakda ng mga limitasyon para sa kasalukuyang shell at ang mga prosesong nililikha nito gamit ang ulimit na utos.

Narito ang mga pagpipilian sa command:

  • -S- malambot na limitasyon
  • -H- mahirap na limitasyon
  • -a- ipakita ang lahat ng impormasyon
  • -f- maximum na laki ng mga nilikhang file
  • -n- maximum na bilang ng mga bukas na file
  • -s- maximum na laki ng stack
  • -t- maximum na dami ng oras ng processor
  • -u- maximum na bilang ng mga tumatakbong proseso
  • -v- maximum na halaga ng virtual memory

Halimbawa, maaari kaming magtakda ng bagong limitasyon sa bilang ng mga file na mabubuksan:

Ngayon tingnan natin:

Itakda natin ang limitasyon ng RAM:

ulimit -Sv 500000

Hayaan mong ipaalala ko sa iyo na ang paghihigpit na ito ay malalapat sa lahat ng mga program na pinaandar sa terminal na ito.

mga konklusyon

Iyon lang. Ngayon ang pamamahala sa mga proseso sa Linux ay hindi magdudulot sa iyo ng mga problema. Sinuri namin ang paksang ito nang detalyado. Kung mayroon kang anumang mga katanungan o mungkahi para sa pagdaragdag sa artikulo, sumulat sa mga komento!

UNIX operating system Robachevsky Andrey M.

Process ID (PID)

Ang bawat proseso ay may natatanging PID, na nagpapahintulot sa kernel ng system na makilala ang mga proseso. Kapag nalikha ang isang bagong proseso, itinatalaga ito ng kernel ng susunod na libreng (iyon ay, hindi nauugnay sa anumang proseso) na identifier. Ang mga identifier ay itinalaga sa isang pataas na pagkakasunud-sunod, i.e. Ang ID ng bagong proseso ay mas malaki kaysa sa ID ng prosesong ginawa bago nito. Kung ang ID ay umabot sa pinakamataas na halaga, ang susunod na proseso ay makakatanggap ng pinakamababang libreng PID at ang cycle ay mauulit. Kapag lumabas ang isang proseso, ilalabas ng kernel ang identifier na inookupahan nito.

Mula sa aklat na Arkitektura ng UNIX Operating System may-akda Bach Maurice J

4.4 PAGGAWA NG PANGALAN NG COMPONENT NG FILE (PATH SA PAGHAHANAP) SA ISANG INDEX ID Ang unang sanggunian sa isang file ay ayon sa kwalipikadong pangalan nito (path ng paghahanap), tulad ng bukas, chdir (baguhin ang direktoryo), o link na mga utos. Dahil sa loob ng system gumagana ang kernel sa mga index, hindi sa

Mula sa aklat na A Rare Profession may-akda Zuev Evgeniy

Ano ang ID? Bilang karagdagan sa mga kalabuan sa syntax, mabilis na lumitaw ang iba pang mga problema. Mas mahirap ipakita sa kanila ang mga halimbawa, kaya kailangan mong ipaliwanag ang mga ito sa mga salita Ang syntax ng C++ na wika ay hindi rin maginhawa sa ibang aspeto. Sa madaling salita, direkta

Mula sa aklat na Programming may-akda Kozlova Irina Sergeevna

11. Identifier. Mga Keyword Ang isang identifier ay isang pagkakasunud-sunod ng mga numero, titik at mga espesyal na character. Sa kasong ito, ang unang karakter ay isang titik o isang espesyal na karakter. Upang makakuha ng mga identifier, maaari mong gamitin ang maliliit o malalaking titik ng alpabetong Latin.

Mula sa aklat na 200 pinakamahusay na mga programa para sa Internet. Sikat na tutorial may-akda Krainsky I

Process Guardian XP Manufacturer: T.A.S. Independent Programming (http://www.tas-independent-programming.com).Status: libre.Download link: http://www.tas-independent-programming.com/cgi-bin/countdown.pl?Guardian exe .Laki: 2.4 MB.Ang pangunahing layunin ng utility na ito ay upang pamahalaan ang mga prosesong tumatakbo sa computer.Pagkatapos

Mula sa aklat na Microsoft Visual C++ at MFC. Programming para sa Windows 95 at Windows NT may-akda Frolov Alexander Vyacheslavovich

Open file identifier Ang klase ng CFile ay may kasamang elemento ng data na m_hFile ng uri ng UINT. Iniimbak nito ang identifier ng bukas na file. Kung nakagawa ka ng isang bagay ng klase ng CFile, ngunit hindi pa nagbubukas ng anumang file, kung gayon ang pare-parehong hFileNull ay nakasulat sa m_hFile Karaniwan hindi na kailangan

Mula sa aklat na UNIX: Process Communication may-akda Stephens William Richard

Transaction ID Ang isa pang bahagi ng diskarte sa timeout at retransmission ay ang paggamit ng mga transaction ID (XIDs) upang makilala ang pagitan ng mga kahilingan ng kliyente at mga tugon ng server. Kapag tumawag ang isang kliyente ng isang function ng RPC, itinatalaga ito ng library

Mula sa aklat na TCP/IP Architecture, Protocols, Implementation (kabilang ang IP version 6 at IP Security) ni Faith Sydney M

16.7 Timestamp at Message ID Kapag tumatanggap ng mail, ito ay kagiliw-giliw na malaman ang oras na ito ay ipinadala at natanggap. Idinaragdag ng SMTP ang impormasyong ito sa ipinasa na mensahe. Bilang karagdagan, sinusubaybayan ng protocol na ito ang lahat ng mga host na nagpadala ng mensaheng mail at ang oras

Mula sa aklat na Adobe Audition 3 tutorial may-akda hindi kilala ang may-akda

Dynamic EQ (proseso) Ang Dynamic na EQ effect ay nag-iiba-iba ang dami ng pag-filter sa paglipas ng panahon. Halimbawa, sa unang kalahati ng wave maaari mong palakasin ang mataas na frequency, at sa pangalawang kalahati maaari mong baguhin ang lapad ng apektadong frequency band. May tatlong tab ang Dynamic EQ window: Gain, Frequency, at Q (bandwidth). 1. Grap ng dalas

Mula sa aklat na PHP Reference ng may-akda

Pan/Expander (proseso) Ang Pan/Expand effect ay nagpapahintulot sa iyo na ilipat ang gitnang channel (mono component) ng isang stereo signal, at palawakin o paliitin ang stereo separation ng kaliwa at kanang channel Ang gitnang channel ay naka-pan gamit ang center at nakapalibot na mga channel ng stereo recording,

Mula sa aklat na Application Development sa Linux Environment. Ikalawang edisyon may-akda Johnson Michael K.

Stretch (proseso) Binibigyang-daan ka ng Stretch effect na baguhin ang pitch (pitch) ng isang audio signal, tempo, o pareho. Halimbawa, maaari mong gamitin ang epektong ito upang taasan ang pitch ng isang soundtrack nang hindi binabago ang tagal nito, o, sa kabaligtaran, baguhin ang tagal nang hindi binabago.

Mula sa aklat na Firebird DATABASE DEVELOPER'S GUIDE ni Borri Helen

Session ID Kaya, ang session ID ay ang pangalan ng pansamantalang storage na gagamitin upang mag-imbak ng data ng session sa pagitan ng mga script run. Isang SID - isang imbakan. Walang SID, walang storage, at vice versa Kaya paano nauugnay ang identifier at pangalan?

Mula sa aklat na UNIX Operating System may-akda Robachevsky Andrey M.

10.2.1. Process ID at Origin Dalawa sa pinakapangunahing katangian ay ang process ID, o pid, at ang ID ng parent process nito. Ang pid ay isang positibong integer na natatanging kinikilala

Mula sa aklat ng may-akda

10.2.3. Filesystem uid Sa napakaespesyal na mga kaso, maaaring kailanganin ng isang program na panatilihin ang mga pribilehiyo ng ugat nito para sa lahat maliban sa pag-access sa filesystem, kung saan ginagamit nito ang uid ng user. Orihinal na ginamit sa Linux NFS space server

Mula sa aklat ng may-akda

Domain ID Kapag gumawa ka ng domain sa isang database, dapat kang tumukoy ng domain ID na natatangi sa buong mundo sa database. Kadalasang gumagamit ng prefix o suffix ang mga developer sa mga identifier ng domain upang pahusayin ang dokumentasyon. Halimbawa: GUMAWA

Mula sa aklat ng may-akda

Mula sa aklat ng may-akda

Parent Process ID (PPID) Ang identifier ng prosesong nagbunga nito

Magkagayunman, ang ilang mga aplikasyon sa Linux minsan nagyeyelo sila. Kasabay nito, may mga sitwasyon kung kailan hindi tumugon ang application, o gumagana nang napakabagal na hindi posible na wakasan ang trabaho nito nang tama. Upang mabilis na makaalis sa nagresultang sitwasyon, maaari mong "patayin" ang prosesong ito. Upang gawin ito, gamitin ang mga utos pumatay At patayin lahat. Ngayon ay malalaman natin kung paano gamitin ang mga utos na ito, hanapin ang PID ng proseso at ipadala ang signal ng SIGKILL.

Upang maiwasan ang pagkalito, sumang-ayon tayo na ang ibig sabihin ng proseso ay isang programa na inilunsad sa system. Halimbawa, kung mayroon kang ilang Mozilla Firefox browser windows na tumatakbo, nangangahulugan ito na tatlong proseso ang tumatakbo.

Tukuyin ang PID ng isang proseso - pidof command

PID— natatanging identifier ng proseso sa system Linux. Upang ihinto nang tama ang isang proseso, dapat mo munang matukoy ang PID nito. Upang gawin ito, gamitin ang ps at grep command. Sa turn nito utos ni ps ay dinisenyo upang ipakita ang isang listahan ng mga aktibong proseso sa system at impormasyon tungkol sa mga ito. utos ng grep tumatakbo nang sabay-sabay sa ps (sa isang channel) at hahanapin ang mga resulta ng ps command. Maaari mong ilista ang lahat ng mga proseso sa pamamagitan ng pagpapatakbo sa command line:

Siyempre, ang PID ay maaari ding matukoy gamit itaas. Ngunit sa karamihan ng mga kaso, ang bilang ng mga proseso ay masyadong malaki (at nagbabago nang pabago-bago sa itaas), kaya hindi ganoon kadaling mabilis at tama na matukoy ang PID. Ito mismo ang ginagamit ng grep command. Halimbawa, upang wakasan ang proseso ng browser ng Google Chrome, kailangan mong patakbuhin ang sumusunod na command:

p.s. | grep chrome

[ ////// ~]$ ps axu | grep chrome
itechf2 20474 2.7 1.5 938416 120136 tty2 Sl+ 11:07 0:00 /opt/google/chrome/chrome

Sa aming kaso, 20474 ang gustong PID. Ang isang mas madaling paraan ay ang paggamit ng command pidof, dapat mong tukuyin ang pangalan ng proseso. Halimbawa:

[ ///// ~]$ pidof chrome
20728 20706 20668 20647 20586 20574 20553 20508 20474

Wakasan ang isang proseso sa Linux - patayin at patayin ang mga utos

Tapusin ang isang proseso sa operating system Linux, alam ang PID nito, maaari mong gamitin ang command pumatay. Ito ay nagkakahalaga ng pag-alam at pag-unawa: ang kill command ay idinisenyo upang magpadala ng signal sa isang proseso. Bilang default, kung hindi namin tinukoy kung aling signal ang ipapadala, ipapadala ang signal ng SIGTERM (mula sa salitang pagwawakas). Sinasabi ng SIGTERM na wakasan ang proseso. Ang bawat signal ay may sariling numero. Ang SIGTERM ay may bilang na 15. Ang isang listahan ng lahat ng mga signal (at ang kanilang mga numero) na maaaring ipadala ng kill command ay maaaring makuha sa pamamagitan ng pagpapatakbo pumatay -l . Upang ipadala ang signal ng SIGKILL (numero 9) upang iproseso ang 2811, tumakbo sa command line:

Kasabay nito, ang signal ng SIGTERM ay maaaring hindi huminto sa proseso (halimbawa, kapag ang signal ay naharang o na-block), ngunit palaging pinapatay ng SIGKILL ang proseso, dahil hindi ito maaaring maharang o balewalain.

killall command sa Linux ay idinisenyo upang "patayin" ang lahat ng mga proseso na may parehong pangalan. Maginhawa ito dahil hindi natin kailangang malaman ang PID ng proseso. Halimbawa, gusto naming isara ang lahat ng mga prosesong pinangalanang chrome. Tumakbo sa terminal:

Ang killall command, tulad ng kill, ay nagpapadala ng SIGTERM signal bilang default. Upang magpadala ng isa pang signal kailangan mong gamitin ang opsyon -s . Halimbawa:



Sa artikulong ito, susubukan naming lumikha ng kernel module na maaaring baguhin ang PID ng isang tumatakbo nang proseso sa Linux, at mag-eksperimento rin sa mga prosesong nakatanggap ng binagong PID.


Babala: Ang pagpapalit ng PID ay isang hindi karaniwang proseso, at sa ilalim ng ilang mga pangyayari ay maaaring humantong sa isang kernel panic.

Ipapatupad ng aming test module ang /dev/test character device, na magbabago sa PID ng proseso kapag nagbabasa mula dito. Salamat sa artikulong ito para sa isang halimbawa ng pagpapatupad ng isang character na device. Ang buong code ng module ay ibinibigay sa dulo ng artikulo. Siyempre, ang pinakatamang solusyon ay ang magdagdag ng system call sa kernel mismo, ngunit ito ay mangangailangan ng muling pag-compile ng kernel.

Kapaligiran

Ang lahat ng mga aktibidad sa pagsubok ng module ay isinagawa sa isang VirtualBox virtual machine na may 64-bit na pamamahagi ng LInux at kernel na bersyon 4.14.4-1. Ang komunikasyon sa makina ay isinagawa gamit ang SSH.

Subukan ang #1 simpleng solusyon

Ang ilang mga salita tungkol sa kasalukuyang: ang kasalukuyang variable ay tumuturo sa isang task_struct na istraktura na may paglalarawan ng proseso sa kernel (PID, UID, GID, cmdline, namespaces, atbp.)

Ang unang ideya ay baguhin lamang ang kasalukuyang->pid na parameter mula sa kernel module patungo sa ninanais.

Static ssize_t device_read(struct file *filp, char *buffer, size_t length, loff_t * offset) ( printk("PID: %d.\n",current->pid); current->pid = 1; printk("bago PID: %d.\n",kasalukuyang->pid); , )
Upang suriin ang pag-andar ng module, sumulat ako ng isang programa sa C++:

#isama #isama #isama int main() ( std::cout<< "My parent PID " << getppid() << std::endl; std::cout << "My PID " << getpid() << std::endl; std::fstream f("/dev/test",std::ios_base::in); if(!f) { std::cout << "f error"; return -1; } std::string str; f >>str; std::cout<< "My new PID " << getpid() << std::endl; execl("/bin/bash","/bin/bash",NULL); }
I-load natin ang module gamit ang insmod command, lumikha ng /dev/test at subukan ito.

# ./a.out Aking magulang PID 293 Aking PID 782 Aking bagong PID 782
Hindi nagbago ang PID. Maaaring hindi lamang ito ang lugar kung saan tinukoy ang PID.

Subukan ang #2 karagdagang mga field ng PID

Kung ang current->pid ay hindi ang process identifier, ano ito? Isang mabilis na pagtingin sa getpid() code na itinuro sa isang task_struct structure na naglalarawan sa proseso ng Linux at pid.c file sa kernel source code. Ang kinakailangang function ay __task_pid_nr_ns. Sa function code ay mayroong call task->pids.pid, babaguhin natin ang parameter na ito

I-compile at subukan

Dahil sinubukan ko sa pamamagitan ng SSH, nakuha ko ang output ng programa bago nag-crash ang kernel:

Aking magulang PID 293 Aking PID 1689 Aking bagong PID 1689
Ang unang resulta ay isang bagay na. Ngunit ang PID ay hindi pa rin nagbabago.

Subukan ang #3 na hindi na-export na mga simbolo ng kernel

Ang isang mas malapit na pagtingin sa pid.c ay nagbunga ng isang function na gumagawa ng kung ano ang kailangan namin
static void __change_pid(struct task_struct *task, enum pid_type type,
struct pid *bago)
Tumatanggap ang function ng isang gawain kung saan kinakailangang baguhin ang PID, ang uri ng PID at, sa katunayan, ang bagong PID. Lumilikha ang function ng isang bagong PID
struct pid *alloc_pid(struct pid_namespace *ns)

Ang function na ito ay tumatanggap lamang ng namespace kung saan ang bagong PID ay maninirahan, ang puwang na ito ay maaaring makuha gamit ang task_active_pid_ns .
Ngunit may isang problema: ang mga simbolo ng kernel na ito ay hindi na-export ng kernel at hindi magagamit sa mga module. Isang kahanga-hanga ang tumulong sa akin sa paglutas ng problemang ito. Ang find_sym function code ay kinuha mula doon.

Static asmlinkage void (*change_pidR)(struct task_struct *task, enum pid_type type, struct pid *pid); static na asmlinkage struct pid* (*alloc_pidR)(struct pid_namespace *ns); static int __init test_init(void) ( printk(KERN_ALERT "TEST driver load!\n"); change_pidR = find_sym("change_pid"); alloc_pidR = find_sym("alloc_pid"); ... ) static ssize_t device_read(struct file * filp, char *buffer, size_t length, loff_t * offset) ( printk("PID: %d.\n",current->pid); struct pid* newpid; newpid = alloc_pidR(task_active_pid_ns(current)); change_pidR(current ,PIDTYPE_PID,newpid printk("bagong PID: %d.\n",kasalukuyang->pid ... )
I-compile, ilunsad

Aking magulang PID 299 Aking PID 750 Aking bagong PID 751
Nagbago ang PID! Ang kernel ay awtomatikong naglaan ng libreng PID sa aming programa. Ngunit posible bang gumamit ng PID na inookupahan ng isa pang proseso, tulad ng PID 1? Idagdag natin ang code pagkatapos ng alokasyon

Newpid->numero.nr = 1;
I-compile, ilunsad

Aking magulang PID 314 Aking PID 1172 Aking bagong PID 1
Nakakakuha kami ng totoong PID 1!

Ang Bash ay naghagis ng isang bug na pumipigil sa paglipat ng gawain gamit ang %n command mula sa paggana, ngunit lahat ng iba pang mga function ay gumagana nang maayos.

Mga kagiliw-giliw na tampok ng mga proseso na may binagong PID

PID 0: hindi maka-log in

Bumalik tayo sa code at baguhin ang PID sa 0.

Newpid->numbers.nr = 0;
I-compile, ilunsad

Aking magulang PID284 Aking PID 1517 Aking bagong PID 0
Kaya ang PID 0 ay hindi ganoon kaespesyal? Kami ay nagagalak, sumulat ng paglabas at...

Ang cannonball ay bumabagsak! Tinukoy ng kernel ang aming gawain bilang IDLE TASK at, nang makita ang pagkumpleto, nag-crash lang. Tila, ang aming programa ay dapat bumalik sa "normal" nitong PID bago lumabas.

Hindi nakikitang proseso

Bumalik tayo sa code at magtakda ng PID na garantisadong hindi magiging abala
newpid->numbers.nr = 12345;

I-compile, ilunsad

Aking magulang PID296 Aking PID 735 Aking bagong PID 12345
Tingnan natin kung ano ang nasa /proc

1 148 19 224 288 37 79 86 93 consoles fb kcore lock partition swaps version 10 149 2 226 29 4 8 87 acpi cpuinfo filesystems key-users meminfo sched_debug sys vmallocinfo 2008 2008 kripto mga key misc schedstat sysrq- trigger vmstat 11 16 208 24 291 6 81 89 buddyinfo na mga device ay nakakaabala sa mga module ng kmsg scsi sysvipc zoneinfo 12 17 21 25 296 7 82 9 bus diskstats iomem kpagecgroup mounts self-thread-self 13 0726 s kpagecount mtrr slabinfo timer_list 139 18 22 27 30 76 84 91 cmdline driver irq kpageflags net softirqs tty 14 182 222 28 31 78 85 92 config.gz execdomains kallsyms loadavg pagetypeinfo stat uptime
Gaya ng nakikita natin, hindi tinutukoy ng /proc ang ating proseso, kahit na sinakop natin ang isang libreng PID. Ang nakaraang PID ay wala din sa /proc, at ito ay lubhang kakaiba. Marahil kami ay nasa ibang namespace at samakatuwid ay hindi nakikita ng main /proc. Mag-mount tayo ng bagong /proc at tingnan kung ano ang naroon

2 83 92 cmdline dma iomem kmsg misc sched_debug swaps uptime 11 15 2 224 28 37 78 84 93 config.gz driver ioports kpagecgroup modules schedstat sys version 12 16 20 226 288 4 79 85 acpi consoles execcounts irqpage 208 23 29 6 8 86 tunog cpuinfo fb ​​​​kallsyms kpageflags mtrr self sysvipc vmstat 139 176 21 24 290 7 80 87 buddyinfo crypto filesystems kcore loadavg net slabinfo thread-self zoneinfo
Ang aming proseso ay wala pa rin, na nangangahulugang kami ay nasa normal na namespace. Suriin natin

Ps -e | grep bash
296 pts/0 00:00:00 bash

Isang bash lang, kung saan namin inilunsad ang programa. Wala sa listahan ang nakaraang PID o ang kasalukuyan.