Linux-da prosesi dayandırın - ps, kill və killall əmrləri. Kernel modulundan istifadə edərək Linux-da prosesin PID-nin dəyişdirilməsi

Bu yazıda biz Linux-da artıq işləyən prosesin PID-ni dəyişdirə bilən nüvə modulu yaratmağa, həmçinin dəyişdirilmiş PID almış proseslərlə sınaqdan keçirməyə çalışacağıq.


Xəbərdarlıq: PID-nin dəyişdirilməsi qeyri-standart bir prosesdir və müəyyən şərtlər altında nüvə panikasına səbəb ola bilər.

Test modulumuz /dev/test simvol cihazını həyata keçirəcək, ondan oxuyarkən prosesin PID-ni dəyişəcək. Bir xarakter cihazının tətbiqi nümunəsi üçün bu məqaləyə təşəkkür edirik. Tam modul kodu məqalənin sonunda verilmişdir. Əlbəttə ki, ən düzgün həll kernelin özünə sistem çağırışı əlavə etmək idi, lakin bu, nüvənin yenidən tərtib edilməsini tələb edəcək.

Ətraf mühit

Bütün modul test fəaliyyətləri 64 bitlik Linux paylanması və 4.14.4-1 nüvə versiyası olan VirtualBox virtual maşınında həyata keçirilib. Maşınla əlaqə SSH istifadə edərək həyata keçirilirdi.

1 saylı sadə həll cəhdi

Cari haqqında bir neçə kəlmə: cari dəyişən nüvədəki prosesin təsviri (PID, UID, GID, cmdline, ad boşluqları və s.) ilə task_struct strukturuna işarə edir.

İlk fikir sadəcə cari->pid parametrini nüvə modulundan istədiyinizə dəyişdirmək idi.

Statik ssize_t device_read(struct file *filp, char *bufer, size_t length, loff_t * offset) ( printk("PID: %d.\n",current->pid); cari->pid = 1; printk("yeni" PID: %d.\n",current->pid); , )
Modulun funksionallığını yoxlamaq üçün C++ dilində proqram yazdım:

#daxildir #daxildir #daxildir 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 >>küç;<< "My new PID " << getpid() << std::endl; execl("/bin/bash","/bin/bash",NULL); }
std::cout

Insmod əmri ilə modulu yükləyək, /dev/test yaradaq və cəhd edək.
# ./a.out Mənim valideyn PID 293 Mənim PID 782 Mənim yeni PID 782

PID dəyişməyib. Bu, PID-nin göstərildiyi yeganə yer olmaya bilər.

№2 əlavə PID sahələrinə cəhd edin

Əgər cari->pid proses identifikatoru deyilsə, bu nədir? getpid() koduna qısa baxış Linux prosesini və nüvənin mənbə kodundakı pid.c faylını təsvir edən task_struct strukturuna işarə etdi. Tələb olunan funksiya __task_pid_nr_ns-dir. Funksiya kodunda call task->pids.pid var, biz bu parametri dəyişəcəyik

Tərtib edin və cəhd edin

SSH vasitəsilə sınaqdan keçirdiyim üçün, nüvə qəzaya uğramazdan əvvəl proqram çıxışını əldə edə bildim:
Mənim valideyn PID 293 Mənim PID 1689 Yeni PID 1689

İlk nəticə artıq bir şeydir. Lakin PID hələ də dəyişməyib.

№3 ixrac olunmayan ləpə simvollarına cəhd edin
statik boşluq __change_pid(struct task_struct *task, enum pid_type növü,
struct pid *yeni)
Funksiya PID-ni, PID növünü və əslində yeni PID-i dəyişdirmək lazım olan tapşırığı qəbul edir. Funksiya yeni PID yaradır
struct pid *alloc_pid(struct pid_namespace *ns)

Bu funksiya yalnız yeni PID-nin yerləşəcəyi ad sahəsini qəbul edir, bu boşluq task_active_pid_ns istifadə edərək əldə edilə bilər.
Ancaq bir problem var: bu nüvə simvolları nüvə tərəfindən ixrac edilmir və modullarda istifadə edilə bilməz. Bu problemi həll etməkdə mənə gözəl biri kömək etdi. find_sym funksiya kodu oradan götürülür.

Static asmlinkage void (*change_pidR)(struct task_struct *task, enum pid_type type, struct pid *pid); statik asmlinkage struct pid* (*alloc_pidR)(struct pid_namespace *ns); static int __init test_init(void) ( printk(KERN_ALERT "TEST sürücüsü yükləndi!\n"); change_pidR = find_sym("dəyişiklik_pid"); alloc_pidR = find_sym("alloc_pid"); ... ) statik ssize_t cihaz_read filp, char *bufer, size_t uzunluğu, loff_t * ofset) ( printk("PID: %d.\n",current->pid); struct pid* newpid; newpid = alloc_pidR(task_active_pid_ns(cari)); change_pidR(cari) ,PIDTYPE_PID,newpid("yeni PID: %d.\n", cari->pid ... )
Tərtib et, işə sal

Mənim valideyn PID 299 Mənim PID 750 Mənim yeni PID 751
PID dəyişdirildi! Kernel avtomatik olaraq proqramımıza pulsuz PID ayırdı. Ancaq PID 1 kimi başqa bir proses tərəfindən işğal edilmiş bir PID-dən istifadə etmək mümkündürmü? Ayrılandan sonra kodu əlavə edək

Newpid->numbers.nr = 1;
Tərtib et, işə sal

Mənim valideyn PID 314 Mənim PID 1172 Mənim yeni PID 1
Biz real PID 1 alırıq!

Bash, %n əmrindən istifadə edərək tapşırıqların dəyişdirilməsinin işləməsinə mane olan bir səhv atdı, lakin bütün digər funksiyalar yaxşı işləyir.

Dəyişən PID ilə proseslərin maraqlı xüsusiyyətləri

PID 0: daxil olmaq mümkün deyil

Koda qayıdaq və PID-i 0-a dəyişdirək.

Newpid->numbers.nr = 0;
Tərtib et, işə sal

Valideynim PID284 Mənim PID 1517 Yeni PID 0
Beləliklə, PID 0 o qədər də xüsusi deyil? Sevinirik, çıxış yazırıq və...

Top gülləsi düşür! Nüvə bizim tapşırığımızı BÖLÜM TASK olaraq təyin etdi və tamamlandığını görərək, sadəcə çökdü. Görünür, proqramımız çıxmazdan əvvəl “normal” PID-ə qayıtmalıdır.

Görünməz proses

Koda qayıdaq və məşğul olmamaq üçün zəmanət verilən bir PID təyin edək
newpid->numbers.nr = 12345;

Tərtib et, işə sal

Valideynim PID296 Mənim PID 735 Yeni PID 12345
Gəlin /proc-da nə olduğuna baxaq

1 148 19 224 288 37 79 86 93 konsollar fb kcore kilidləri arakəsmələri dəyişdirmə versiyası 10 149 2 226 29 4 8 87 acpi cpuinfo fayl sistemləri açar istifadəçiləri meminfo sched_debug info vmallo sys v1002 5 8 asound kripto fs açarları misc schedstat sysrq- trigger vmstat 11 16 208 24 291 6 81 89 buddyinfo cihazları kmsg modullarını kəsir scsi sysvipc zoneinfo 12 17 21 25 296 7 82 9 avtobus diskləri iomem kpagecgroup mounts 16 73 self12 90 dma ioports 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 iş vaxtı
Gördüyümüz kimi, pulsuz PID-i tutsaq da, /proc prosesimizi müəyyən etmir. Əvvəlki PID də /proc-da deyil və bu çox qəribədir. Ola bilsin ki, biz fərqli ad məkanındayıq və buna görə də main /proc üçün görünmürük. Gəlin yeni /proc quraşdıraq və orada nə olduğunu görək

1 14 18 210 25 291 738 81 9 avtobus cihazları fs açar istifadəçiləri kilidlər pagetypeinfo softirqs timer_list 10 148 182 22 26 296 741 82 90 qruplar diskstatlar fasilələr bölmələri məlumatı stat192 30 76 83 92 cmdline dma iomem kmsg misc sched_debug dəyişdirmə iş vaxtı 11 15 2 224 28 37 78 84 93 config.gz driver ioports kpagecgroup modulları schedstat sys versiyası 12 16 20 226 288 4 79 85 acpi consoles mountsrqyssecc info 13 17 208 23 29 6 8 86 asound cpuinfo fb-kallsyms kpageflags mtrr self sysvipc vmstat 139 176 21 24 290 7 80 87 buddyinfo kripto fayl sistemləri kcore loadavg net slabinfo thread-self zoneinfo
Prosesimiz hələ də mövcud deyil, yəni normal ad məkanındayıq. yoxlayaq

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

Proqramı işə saldığımız yalnız bir bash. Nə əvvəlki PID, nə də cari siyahıda yoxdur.

Sizcə, Linux əməliyyat sistemi avtomatik olaraq özünü idarə edə bilərmi? Hər şey qaydasında olduqda və ya qeyri-standart xüsusiyyətlərə ehtiyacınız olmadıqda, bəli. Ancaq bəzən onun işinə müdaxiləniz lazım ola bilər.

Linux-da hər bir fərdi proqram işə salındıqda proses yaradılır. Proqramı özünüz işə salmağınızın və ya sistemin və ya nüvənin bunu etməsinin fərqi yoxdur. Məsələn, nüvə yükləndikdən dərhal sonra işə salınan inisializasiya proqramının da ID 0 ilə öz prosesi var. Linux-da prosesləri proqramın vəziyyəti və icrası haqqında bütün məlumatların saxlandığı konteynerlər kimi təsvir etmək olar. Proqram yaxşı işləyirsə, deməli hər şey yaxşıdır, ancaq donarsa və ya işini tənzimləmək lazımdırsa, Linux-da prosesin idarə edilməsinə ehtiyacınız ola bilər.

Bu məqalə geniş mövzunu əhatə edəcək və biz aşağıdakı imkanları nəzərdən keçirəcəyik:

  • Çalışan proseslərə baxın
  • Proses məlumatlarına baxmaq
  • Linux-da proseslərin tapılması
  • Proses prioritetinin dəyişdirilməsi
  • Proseslərin dayandırılması
  • Proses üçün mövcud yaddaşın məhdudlaşdırılması

Məqalədəki ilk məqamları daxil etməyə kömək edə bilmədim, lakin onlar çox sadədir və biz onlara ətraflı şəkildə girməyəcəyik. Ancaq qalan hər şey mürəkkəb və kifayət qədər təsvir olunmamış görünə bilər.

Şərtləri başa düşməklə başlayaq. Əslində bir proses hər bir proqramdır. Artıq dediyim kimi, işə salınan hər bir proqram üçün ayrıca proses yaradılır. Prosesin bir hissəsi olaraq proqrama CPU vaxtı, RAM və digər sistem resursları ayrılır. Hər bir prosesin öz identifikatoru, Proses İD və ya sadəcə PID var və Linux prosesləri çox vaxt onlar tərəfindən müəyyən edilir. PID, dediyim kimi, təsadüfi olaraq təyin edilmir, başlatma proqramı PID 1 alır və hər bir sonrakı işə salınan proqram daha bir alır. Beləliklə, istifadəçi proqramlarının PID-i bir neçə minə çatır.

Əslində, Linux prosesləri indi sizə göründüyü qədər mücərrəd deyil. Onları hiss etməyə cəhd edə bilərsiniz. Fayl menecerinizi açın, kök qovluğuna gedin, sonra /proc qovluğunu açın. Burada bir dəstə rəqəm görürsünüz? Beləliklə, hamısı budur - bütün işləyən proseslərin PID-i. Bu qovluqların hər birində proseslə bağlı bütün məlumatlar var.

Məsələn, 1-ci prosesin qovluğuna baxaq. Qovluqda başqa alt kataloqlar və bir çox fayl var. Cmdline faylında prosesin işə salınması əmri haqqında məlumat var:

cat /proc/1/cmdline

/usr/lib/systemd/systemd

Mən Systemd başlatma sistemindən istifadə etdiyim üçün onun üçün ilk proses işə salınır. /proc kataloqu ilə hər şeyi edə bilərsiniz. Ancaq bu, xüsusilə sistemdə işləyən proseslərin sayını nəzərə alsaq, çox əlverişsizdir. Buna görə də, lazımi vəzifələri həyata keçirmək üçün xüsusi kommunal xidmətlər var. Linux-da prosesin idarə edilməsini həyata keçirməyə imkan verən utilitləri nəzərdən keçirək.

Linux-da proseslərin idarə edilməsi

Linux müxtəlif proseslərin idarə edilməsi vəzifələrini həll etmək üçün çox sayda yardımçı proqrama malikdir. Bunlara htop, top kimi çoxfunksiyalı həllər, eləcə də sadə kommunal proqramlar, məsələn, ps, kill, killall, who və s. Birincisi onun çox sadə olması, ikincisi htopun daha yaxşı olmasıdır. Biz htop proqramı və onun GNU tipli utilitlər şəklində analoqları ilə işləməyə diqqət yetirəcəyik, bir kommunal - bir funksiya.

Əgər sizdə artıq quraşdırılmayıbsa, htop-u quraşdıraq. Ubuntu-da bu belə edilir:

sudo apt install htop

Digər paylamalarda sadəcə paket menecerinizdən istifadə etməlisiniz. Paketin adı eynidir.

Çalışan proseslərə baxın

Bu çox sadə bir işdir və onu həll etmək də asandır. Bunun üçün adi ps-dən tutmuş daha təkmil interaktiv top, htop və s.-ə qədər bir çox kommunal proqramlar var.

Htop-u açdıqdan sonra dərhal işləyən proseslərin siyahısını görürük. Təbii ki, burada bütün Linux prosesləri göstərilmir, sistemdə onların çoxu var, siz artıq bilirsiniz ki, onların hamısı bir ekrana sığmayacaq. Defolt olaraq, istifadəçiniz kimi işləyən proseslər göstərilir:

Proses haqqında aşağıdakı məlumatları görə bilərsiniz:

  • PID- proses identifikatoru
  • İSTİFADƏÇİ- prosesin başladığı istifadəçi
  • PRI- nüvə səviyyəsində linux prosesinin prioriteti (adətən NI+20)
  • N.İ- prosesin icrası prioriteti -20-dən 19-a qədər
  • S- proses vəziyyəti
  • CPU- CPU resurslarından istifadə olunur
  • MEM- istifadə olunan yaddaş
  • ZAMAN- prosesin icra müddəti

Ekrana əlavə parametrlər əlavə edə bilərsiniz, lakin bunlar əsas olanlardır. Siz Quraşdırma menyusundan istifadə edərək parametrlər əlavə edə bilərsiniz. Orada hər şey çox sadədir, məsləhətləri oxuyun və təlimatlara əməl edin. Məsələn, PPID parametri əlavə olunur:

Proqramın çox mühüm xüsusiyyəti ondan ibarətdir ki, siz Linux-da prosesləri istədiyiniz parametrə görə çeşidləyə bilərsiniz. Sadəcə parametrin adının üzərinə klikləyin, o, yaşıl rənglə vurğulanacaq və çeşidləmə aparılacaq. Məsələn, proseslərin hansı ardıcıllıqla işə salındığını görmək istəyirsinizsə, biz PID-ə görə sıralayırıq:

Bir ağacda prosesləri təşkil etmək üçün maraqlı bir seçim də var. Hansı prosesin müəyyən bir prosesin başladığını görə biləcəksiniz. Ağacı göstərmək üçün F5 düyməsini basın:

ps proqramından istifadə edərək demək olar ki, eyni hərəkətləri edə bilərsiniz. Yalnız burada belə rahat interaktiv rejim yoxdur. Hər şey seçimlərdən istifadə etməklə edilir.

İstifadə edəcəyimiz əsas variantlara baxaq:

  • -e- bütün proseslər haqqında məlumatı göstərmək
  • -a- ən çox tələb olunan bütün proseslər haqqında məlumatları göstərin
  • -t- yalnız bu terminaldan prosesləri göstərin
  • -səh- yalnız göstərilən proses haqqında məlumatı göstərin
  • -u- yalnız müəyyən bir istifadəçinin proseslərini göstərin

Bir sözlə, Linux-da hazırda aktiv olan bütün proseslərə baxmaq üçün aux seçimlərinin birləşməsindən istifadə edin:

Proqram bütün eyni parametrləri göstərir, yalnız interaktiv interfeys yoxdur. Burada prosesləri çeşidləmək qeyri-mümkün olduğunu düşünürsən, amma səhv edirsən, bu mümkündür. Bunun üçün bir sıralama variantı var. Onları istənilən sahəyə görə sıralaya bilərsiniz, məsələn:

ps aux --sort=%mem

Siyahı tərs qaydada sıralanacaq, aşağıda daha çox dəyər, yuxarıda isə daha azdır. Bunu tərsinə etmək lazımdırsa, mənfi əlavə edin:

ps aux --sort=-%cpu

Linux proses prioritetləri və ya hər hansı digər parametrlər çeşidləmə sahəsi kimi istifadə edilə bilər. Bütün məlumatları göstərməyə ehtiyac yoxdursa, çıxışı da kəsə bilərsiniz:

Görünür ki, ps-nin ağacları emal etmək qabiliyyəti yoxdur. Ancaq əslində deyil, bunun üçün ayrıca bir əmr var:

Linux-da proseslərin tapılması

Proseslərin siyahısı yaxşıdır. Amma bəzən hansısa proses donduqda və Linux prosesini öldürməli olduğumuzda və ya onunla bəzi hərəkətlər etməli olduğumuz zaman siyahıdan bu prosesi seçməli, onun PID-sini və bu haqda məlumatı öyrənməliyik.

Htop-da linux prosesini tapmaq üçün F3 düyməsini istifadə edə bilərsiniz. F3 düyməsini basın və istədiyiniz sözü yazın. Sonra, növbəti girişə keçmək üçün axtarışı tamamlamaq üçün F2 və ya Esc düyməsini basın:

Htop-da prosesləri axtarmaq üçün htop filtrindən də istifadə edə bilərsiniz. F4 düyməsini basın, söz daxil edin və yalnız adı bu sözü ehtiva edən linux prosesləri siyahıya alınacaq.

Ps yardım proqramında heç bir filtrasiya yoxdur, lakin Linux prosesini tapmaq üçün ps-in çıxışını ona yönləndirərək grep yardım proqramından istifadə edə bilərik:

ps aux | grep xrom

Bu, çox istifadə olunan bir əmrdir.

Proses prioritetinin dəyişdirilməsi

Linux prosesinin prioriteti, digərləri ilə müqayisədə bu prosesə nə qədər çox CPU vaxtının veriləcəyi deməkdir. Bu yolla biz hansı proqramın daha sürətli, hansının isə daha yavaş işləyəcəyini çox gözəl tənzimləyə bilərik. Prioritet dəyəri 19 (minimum prioritet) ilə -20 arasında dəyişə bilər - linux prosesinin maksimum prioriteti. Üstəlik, adi bir istifadəçinin hüquqları ilə prioriteti azalda bilərsiniz, lakin onu artırmaq üçün super istifadəçi hüquqları lazımdır.

htop prioriteti idarə etmək üçün Nice parametrindən istifadə edir. Nəzərinizə çatdırım ki, Priv sadəcə bir düzəlişdir, əksər hallarda bu, Nice-dən 20-dir. Prosesin prioritetini dəyişdirmək üçün sadəcə kursoru onun üzərinə qoyun və rəqəmi azaltmaq (prioriteti artırmaq) və ya F8 düyməsini basın. sayını artırmaq.

Ancaq Linux proseslərini idarə etmək üçün bu vəzifəni həll etmək üçün htop istifadə etmək lazım deyil. Başqa əmrlərlə hər şeyi edə bilərsiniz. Məsələn, gözəl əmr. Bundan istifadə edərək, işə salınacaq prosesin prioritetini təyin edə bilərsiniz:

gözəl -n 10 apt-get yeniləməsi

Və ya mövcud olanın prioritetini pid ilə dəyişdirin:

renice -n 10 -səh 1343

Linux-da proseslərin dayandırılması

Əgər proses donubsa və cavab vermirsə, o, dayandırılmalıdır. Htop-da, Linux prosesini öldürmək üçün kursoru prosesə qoyun və F9 düyməsini basın:

Sistem prosesləri idarə etmək üçün müəyyən siqnallardan istifadə edir, prosesin dayandırılmasını göstərən siqnallar var; Budur bəzi əsas siqnallar:

  • SIGKILL- prosesin məlumatların saxlanmasını və bitməsini xahiş edin
  • SIGTERM- qənaət etmədən prosesi dərhal bitirin

Ümumiyyətlə, bir neçə onlarla siqnal var, lakin biz onları nəzərdən keçirməyəcəyik. SIGKILL siqnalını göndərək:

Öldürmə proqramından da istifadə edə bilərsiniz:

Siz həmçinin bir prosesi adla öldürə bilərsiniz:

killall xrom

Prosesin məhdudlaşdırılması

Linux-da prosesin idarə edilməsi demək olar ki, hər şeyi idarə etməyə imkan verir. Nə edilə biləcəyini artıq görmüsünüz, lakin daha çox şey etmək olar. Ulimit əmrindən və /etc/security/limits.conf konfiqurasiya faylından istifadə edərək, siz proseslərin yaddaş, fayllar və prosessor kimi sistem resurslarına çıxışını məhdudlaşdıra bilərsiniz. Məsələn, Linux proses yaddaşını, faylların sayını və s. məhdudlaşdıra bilərsiniz.

Fayldakı giriş belə görünür:

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

  • domen- istifadəçi adı, qrup adı və ya UID
  • növü- məhdudiyyətlərin növü - yumşaq və ya sərt
  • element- məhdud olacaq resurs
  • məna- tələb olunan limit

Sərt məhdudiyyətlər super istifadəçi tərəfindən müəyyən edilir və adi istifadəçilər tərəfindən dəyişdirilə bilməz. Yumşaq məhdudiyyətlər ulimit əmrindən istifadə edərək istifadəçilər tərəfindən dəyişdirilə bilər.

Proseslərə tətbiq edilə bilən əsas məhdudiyyətlərə baxaq:

  • nofile
  • kimi- maksimum RAM miqdarı
  • yığın- maksimum yığın ölçüsü
  • CPU- maksimum prosessor vaxtı
  • nproc- prosessor nüvələrinin maksimum sayı
  • qıfıllar- kilidlənmiş faylların sayı
  • gözəl- maksimum proses prioriteti

Məsələn, istifadəçi sergiy prosesləri üçün prosessor vaxtını məhdudlaşdıraq:

sergiy hard nproc 20

Proc qovluğunda müəyyən bir proses üçün məhdudiyyətlərə baxa bilərsiniz:

cat /proc/PID/limitlər

Maksimum cpu vaxtı limitsiz limitsiz saniyə
Maksimum fayl ölçüsü limitsiz limitsiz bayt
Maksimum məlumat ölçüsü limitsiz limitsiz bayt
Maksimum yığın ölçüsü 204800 limitsiz bayt
Maksimum əsas fayl ölçüsü 0 limitsiz bayt
Maksimum rezident limitsiz limitsiz bayt təyin edir
Maksimum proseslər 23562 23562 prosesdir
Maksimum açıq fayl 1024 4096 fayl
Maksimum kilidlənmiş yaddaş 18446744073708503040 18446744073708503040 bayt
Maksimum ünvan sahəsi limitsiz limitsiz bayt
Max fayl limitsiz limitsiz kilidləri kilidləyir
Gözləyən maksimum siqnallar 23562 23562 siqnallar
Maksimum mesaj növbəsinin ölçüsü 819200 819200 bayt
Maksimum gözəl prioritet 0 0
Maks real vaxt prioriteti 0 0
Maksimum real vaxt fasiləsi limitsiz limitsiz bizə

Bu şəkildə dəyişdirilən məhdudiyyətlər yenidən başladıqdan sonra qüvvəyə minəcək. Lakin biz həmçinin ulimit əmrindən istifadə edərək cari qabıq və onun yaratdığı proseslər üçün limitlər təyin edə bilərik.

Budur əmr seçimləri:

  • -S- yumşaq limit
  • -H- sərt hədd
  • -a- bütün məlumatları göstərin
  • -f- yaradılmış faylların maksimum ölçüsü
  • -n- açıq faylların maksimum sayı
  • -s- maksimum yığın ölçüsü
  • -t- prosessor vaxtının maksimum miqdarı
  • -u- işləyən proseslərin maksimum sayı
  • -v- virtual yaddaşın maksimum miqdarı

Məsələn, açıla bilən faylların sayına yeni limit qoya bilərik:

İndi baxaq:

RAM limitini təyin edək:

ulimit -Sv 500000

Nəzərinizə çatdırım ki, bu məhdudiyyət bu terminalda icra edilən bütün proqramlara şamil olunacaq.

Nəticələr

bu qədər. İndi Linux-da prosesləri idarə etmək sizə problem yaratmayacaq. Bu mövzunu çox ətraflı araşdırdıq. Məqaləyə əlavə etmək üçün hər hansı bir sualınız və ya təklifiniz varsa, şərhlərdə yazın!

UNIX əməliyyat sistemi Robaçevski Andrey M.

Proses ID (PID)

Hər bir proses sistem nüvəsinə prosesləri ayırmağa imkan verən unikal PID-ə malikdir. Yeni proses yaradıldıqda, nüvə ona növbəti pulsuz (yəni heç bir proseslə əlaqəli olmayan) identifikator təyin edir. İdentifikatorlar artan qaydada təyin edilir, yəni. Yeni prosesin identifikatoru ondan əvvəl yaradılmış prosesin identifikatorundan böyükdür. ID maksimum dəyərə çatarsa, növbəti proses minimum pulsuz PID alacaq və dövr təkrarlanır. Proses çıxdıqda, nüvə tutduğu identifikatoru buraxır.

UNIX Əməliyyat Sisteminin Memarlığı kitabından müəllif Bax Moris J

4.4 FAYIN KOMPONENT ADINI (AXTARIŞ YOLU) İNDEKS İD-NİFASINA ÇEVİRMƏSİ Fayla ilkin istinad, open, chdir (qovluq dəyişdirmə) və ya keçid əmrlərində olduğu kimi onun uyğun adı (axtarış yolu) ilə olur. Çünki sistemin daxilində ləpə indekslərlə deyil, indekslərlə işləyir

Nadir bir peşə kitabından müəllif Zuev Evgeniy

Şəxsiyyət vəsiqəsi nədir? Sintaksisdəki qeyri-müəyyənliklərə əlavə olaraq, tez bir zamanda başqa problemlər də ortaya çıxdı. Onları misallarla göstərmək daha çətindir, ona görə də onları sözlə izah etməli olacaqsınız C++ dilinin sintaksisi də başqa baxımdan əlverişsizdir. Bir sözlə, birbaşa

Proqramlaşdırma kitabından müəllif Kozlova İrina Sergeevna

11. İdentifikator. Açar sözlər İdentifikator rəqəmlərin, hərflərin və xüsusi simvolların ardıcıllığıdır. Bu halda birinci simvol hərf və ya xüsusi simvoldur. İdentifikatorları əldə etmək üçün siz Latın əlifbasının kiçik və ya böyük hərflərindən istifadə edə bilərsiniz.

Kitabdan internet üçün 200 ən yaxşı proqram. Populyar dərslik müəllif Krainsky I

Process Guardian XP İstehsalçı: T.A.S. Müstəqil Proqramlaşdırma (http://www.tas-independent-programming.com).Statusu: pulsuz.Yükləmə linki: http://www.tas-independent-programming.com/cgi-bin/countdown.pl?Guardian .Ölçüsü: 2.4 MB. Bu yardım proqramının əsas məqsədi kompüterdə işləyən prosesləri idarə etməkdir.

Microsoft Visual C++ və MFC kitabından. Windows 95 və Windows NT üçün proqramlaşdırma müəllif Frolov Aleksandr Vyaçeslavoviç

Açıq fayl identifikatoru CFile sinfinə UINT tipli m_hFile məlumat elementi daxildir. Açıq faylın identifikatorunu saxlayır. Əgər siz CFile sinfinin obyektini yaratmısınızsa, lakin hələ heç bir fayl açmamısınızsa, onda hFileNull sabiti m_hFile-də yazılır. Adətən buna ehtiyac yoxdur

UNIX kitabından: Proses Kommunikasiyası müəllif Stephens William Richard

Tranzaksiya ID-si Vaxt aşımı və təkrar ötürmə strategiyasının başqa bir hissəsi müştəri sorğuları və server cavabları arasında fərq qoymaq üçün əməliyyat identifikatorlarından (əməliyyat identifikatorları və ya XID-lər) istifadə etməkdir. Müştəri RPC funksiyasını çağırdıqda, kitabxana bunu təyin edir

Kitabdan TCP/IP Architecture, Protocols, Implementation (o cümlədən IP version 6 və IP Security) tərəfindən Faith Sydney M

16.7 Zaman möhürü və mesajın identifikatoru Məktub qəbul edərkən onun göndərildiyi və qəbul edildiyi vaxtı bilmək maraqlıdır. SMTP bu məlumatı yönləndirilən mesaja əlavə edir. Bundan əlavə, bu protokol poçt mesajını ötürən bütün hostları və vaxtı izləyir

Adobe Audition 3 dərsliyi kitabından müəllif Müəllif naməlum

Dynamic EQ (proses) Dinamik EQ effekti zamanla filtrləmə miqdarını dəyişir. Məsələn, dalğanın birinci yarısında yüksək tezlikləri gücləndirə, ikinci yarısında isə təsirə məruz qalan tezlik bandının enini dəyişə bilərsiniz. Dynamic EQ pəncərəsində üç nişan var: Qazanc, Tezlik və Q (bant genişliyi). 1. Tezlik qrafiki

Müəllifin PHP Reference kitabından

Pan/Genişləndirici (proses) Pan/Genişləndirici effekti sizə stereo siqnalın mərkəzi kanalını (mono komponent) köçürməyə və sol və sağ kanalların stereo ayrılmasını genişləndirməyə və ya daraltmağa imkan verir stereo qeydin ətraf kanalları,

Linux Mühitində Proqram İnkişafı kitabından. İkinci nəşr müəllif Johnson Michael K.

Uzatma (proses) Uzatma effekti sizə audio siqnalın, tempin və ya hər ikisinin hündürlüyünü (boyu) dəyişməyə imkan verir. Məsələn, bu effektdən istifadə edərək, musiqinin müddətini dəyişmədən səs tonunu artıra və ya əksinə, müddəti dəyişmədən dəyişə bilərsiniz.

Firebird DATABASE DEVELOPER'S GUIDE kitabından Borri Helen tərəfindən

Sessiya identifikatoru Beləliklə, sessiya identifikatoru skript əməliyyatları arasında sessiya məlumatlarını saxlamaq üçün istifadə ediləcək müvəqqəti yaddaşın adıdır. Bir SID - bir yaddaş. SID yoxdur, yaddaş yoxdur və əksinə, identifikator və ad necə əlaqəlidir?

UNIX Əməliyyat Sistemi kitabından müəllif Robaçevski Andrey M.

10.2.1. Proses ID və Origin Ən əsas atributlardan ikisi proses identifikatoru və ya pid və onun əsas prosesinin identifikatorudur. pid unikal şəkildə müəyyən edən müsbət tam ədəddir

Müəllifin kitabından

10.2.3. Fayl sistemi uid Çox xüsusi hallarda, proqram istifadəçinin uid-dən istifadə etdiyi fayl sisteminə giriş istisna olmaqla, hər şey üçün öz kök imtiyazlarını saxlamalı ola bilər. Əvvəlcə Linux NFS kosmik serverində istifadə edilmişdir

Müəllifin kitabından

Domain ID verilənlər bazasında domen yaratdığınız zaman verilənlər bazasında qlobal miqyasda unikal olan domen ID-ni göstərməlisiniz. Tərtibatçılar tez-tez sənədləri təkmilləşdirmək üçün domen identifikatorlarında prefiks və ya şəkilçidən istifadə edirlər. Məsələn: CREATE

Müəllifin kitabından

Müəllifin kitabından

Ana Proses ID (PPID) Bunu yaradan prosesin identifikatoru

Nə olursa olsun, bəzi tətbiqlərdə Linux bəzən donurlar. Eyni zamanda, tətbiqin ümumiyyətlə cavab vermədiyi və ya o qədər yavaş işlədiyi vəziyyətlər var ki, onun işini düzgün şəkildə dayandırmaq mümkün deyil. Yaranan vəziyyətdən tez çıxmaq üçün bu prosesi "öldürə" bilərsiniz. Bunu etmək üçün əmrlərdən istifadə edin öldürməköldürmək. İndi bu əmrlərdən necə istifadə edəcəyimizi anlayacağıq, prosesin PID-ini tapacağıq və SIGKILL siqnalını göndərəcəyik.

Qarışıqlığın qarşısını almaq üçün gəlin razılaşaq ki, proses dedikdə sistemdə işə salınmış proqramı nəzərdə tuturuq. Məsələn, bir neçə Mozilla Firefox brauzer pəncərəniz varsa, bu o deməkdir ki, üç proses işləyir.

Prosesin PID-ini təyin edin - pidof əmri

PID— sistemdə unikal proses identifikatoru Linux. Prosesi düzgün dayandırmaq üçün əvvəlcə onun PID-sini təyin etməlisiniz. Bunun üçün ps və grep komandalarından istifadə edin. Öz növbəsində ps əmri sistemdə aktiv proseslərin siyahısını və onlar haqqında məlumatı göstərmək üçün nəzərdə tutulmuşdur. grep əmri ps ilə eyni vaxtda işləyir (kanalda) və ps əmrinin nəticələrini axtaracaq. Komanda xəttində işləyərək bütün prosesləri sadalaya bilərsiniz:

Əlbəttə ki, PID istifadə edərək də müəyyən edilə bilər üst. Ancaq əksər hallarda proseslərin sayı çox böyükdür (və yuxarıda dinamik olaraq dəyişir), buna görə də PID-i tez və düzgün müəyyən etmək o qədər də asan deyil. Grep əmri məhz bunun üçün istifadə olunur. Məsələn, Google Chrome brauzer prosesini dayandırmaq üçün aşağıdakı əmri yerinə yetirməlisiniz:

p.s grep xrom

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

Bizim vəziyyətimizdə 20474 istənilən PID-dir. Daha asan yol əmrdən istifadə etməkdir pidof, prosesin adını göstərməlisiniz. Məsələn:

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

Linux-da prosesi dayandırın - kill və killall əmrləri

Əməliyyat sistemində bir prosesi dayandırın Linux, onun PID-sini bilməklə, əmrdən istifadə edə bilərsiniz öldürmək. Bilməyə və başa düşməyə dəyər: öldürmə əmri bir prosesə siqnal göndərmək üçün nəzərdə tutulmuşdur. Varsayılan olaraq, hansı siqnalın göndəriləcəyini təyin etməsək, SIGTERM siqnalı (sonlandırma sözündən) göndərilir. SIGTERM prosesi dayandırmağı əmr edir. Hər bir siqnalın öz nömrəsi var. SIGTERM 15 nömrəlidir. Öldürmə əmrinin göndərə biləcəyi bütün siqnalların (və onların nömrələrinin) siyahısını işə salmaqla əldə etmək olar. öldür -l . 2811 prosesinə SIGKILL siqnalını (nömrə 9) göndərmək üçün əmr satırında işə salın:

Eyni zamanda, SIGTERM siqnalı prosesi dayandırmaya bilər (məsələn, siqnal tutulduqda və ya bloklandıqda), lakin SIGKILL həmişə prosesi öldürür, çünki onu ələ keçirmək və ya gözardı etmək olmaz.

killall əmri Linux-da eyni adlı bütün prosesləri "öldürmək" üçün nəzərdə tutulmuşdur. Bu, rahatdır, çünki prosesin PID-ini bilməyə ehtiyacımız yoxdur. Məsələn, biz xrom adlı bütün prosesləri bağlamaq istəyirik. Terminalda işləyin:

Killall əmri, kill kimi, standart olaraq SIGTERM siqnalını göndərir. Başqa bir siqnal göndərmək üçün seçimdən istifadə etməlisiniz -s . Məsələn:



Bu yazıda biz Linux-da artıq işləyən prosesin PID-ni dəyişdirə bilən nüvə modulu yaratmağa, həmçinin dəyişdirilmiş PID almış proseslərlə sınaqdan keçirməyə çalışacağıq.


Xəbərdarlıq: PID-nin dəyişdirilməsi qeyri-standart bir prosesdir və müəyyən şərtlər altında nüvə panikasına səbəb ola bilər.

Test modulumuz /dev/test simvol cihazını həyata keçirəcək, ondan oxuyarkən prosesin PID-ni dəyişəcək. Bir xarakter cihazının tətbiqi nümunəsi üçün bu məqaləyə təşəkkür edirik. Tam modul kodu məqalənin sonunda verilmişdir. Əlbəttə ki, ən düzgün həll kernelin özünə sistem çağırışı əlavə etmək idi, lakin bu, nüvənin yenidən tərtib edilməsini tələb edəcək.

Ətraf mühit

Bütün modul test fəaliyyətləri 64 bitlik Linux paylanması və 4.14.4-1 nüvə versiyası olan VirtualBox virtual maşınında həyata keçirilib. Maşınla əlaqə SSH istifadə edərək həyata keçirilirdi.

1 saylı sadə həll cəhdi

Cari haqqında bir neçə kəlmə: cari dəyişən nüvədəki prosesin təsviri (PID, UID, GID, cmdline, ad boşluqları və s.) ilə task_struct strukturuna işarə edir.

İlk fikir sadəcə cari->pid parametrini nüvə modulundan istədiyinizə dəyişdirmək idi.

Statik ssize_t device_read(struct file *filp, char *bufer, size_t length, loff_t * offset) ( printk("PID: %d.\n",current->pid); cari->pid = 1; printk("yeni" PID: %d.\n",current->pid); , )
Modulun funksionallığını yoxlamaq üçün C++ dilində proqram yazdım:

#daxildir #daxildir #daxildir 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 >>küç;<< "My new PID " << getpid() << std::endl; execl("/bin/bash","/bin/bash",NULL); }
std::cout

Insmod əmri ilə modulu yükləyək, /dev/test yaradaq və cəhd edək.
# ./a.out Mənim valideyn PID 293 Mənim PID 782 Mənim yeni PID 782

PID dəyişməyib. Bu, PID-nin göstərildiyi yeganə yer olmaya bilər.

№2 əlavə PID sahələrinə cəhd edin

Əgər cari->pid proses identifikatoru deyilsə, bu nədir? getpid() koduna qısa baxış Linux prosesini və nüvənin mənbə kodundakı pid.c faylını təsvir edən task_struct strukturuna işarə etdi. Tələb olunan funksiya __task_pid_nr_ns-dir. Funksiya kodunda call task->pids.pid var, biz bu parametri dəyişəcəyik

Tərtib edin və cəhd edin

SSH vasitəsilə sınaqdan keçirdiyim üçün, nüvə qəzaya uğramazdan əvvəl proqram çıxışını əldə edə bildim:
Mənim valideyn PID 293 Mənim PID 1689 Yeni PID 1689

İlk nəticə artıq bir şeydir. Lakin PID hələ də dəyişməyib.

№3 ixrac olunmayan ləpə simvollarına cəhd edin
statik boşluq __change_pid(struct task_struct *task, enum pid_type növü,
struct pid *yeni)
Funksiya PID-ni, PID növünü və əslində yeni PID-i dəyişdirmək lazım olan tapşırığı qəbul edir. Funksiya yeni PID yaradır
struct pid *alloc_pid(struct pid_namespace *ns)

Bu funksiya yalnız yeni PID-nin yerləşəcəyi ad sahəsini qəbul edir, bu boşluq task_active_pid_ns istifadə edərək əldə edilə bilər.
Ancaq bir problem var: bu nüvə simvolları nüvə tərəfindən ixrac edilmir və modullarda istifadə edilə bilməz. Bu problemi həll etməkdə mənə gözəl biri kömək etdi. find_sym funksiya kodu oradan götürülür.

Static asmlinkage void (*change_pidR)(struct task_struct *task, enum pid_type type, struct pid *pid); statik asmlinkage struct pid* (*alloc_pidR)(struct pid_namespace *ns); static int __init test_init(void) ( printk(KERN_ALERT "TEST sürücüsü yükləndi!\n"); change_pidR = find_sym("dəyişiklik_pid"); alloc_pidR = find_sym("alloc_pid"); ... ) statik ssize_t cihaz_read filp, char *bufer, size_t uzunluğu, loff_t * ofset) ( printk("PID: %d.\n",current->pid); struct pid* newpid; newpid = alloc_pidR(task_active_pid_ns(cari)); change_pidR(cari) ,PIDTYPE_PID,newpid("yeni PID: %d.\n", cari->pid ... )
Tərtib et, işə sal

Mənim valideyn PID 299 Mənim PID 750 Mənim yeni PID 751
PID dəyişdirildi! Kernel avtomatik olaraq proqramımıza pulsuz PID ayırdı. Ancaq PID 1 kimi başqa bir proses tərəfindən işğal edilmiş bir PID-dən istifadə etmək mümkündürmü? Ayrılandan sonra kodu əlavə edək

Newpid->numbers.nr = 1;
Tərtib et, işə sal

Mənim valideyn PID 314 Mənim PID 1172 Mənim yeni PID 1
Biz real PID 1 alırıq!

Bash, %n əmrindən istifadə edərək tapşırıqların dəyişdirilməsinin işləməsinə mane olan bir səhv atdı, lakin bütün digər funksiyalar yaxşı işləyir.

Dəyişən PID ilə proseslərin maraqlı xüsusiyyətləri

PID 0: daxil olmaq mümkün deyil

Koda qayıdaq və PID-i 0-a dəyişdirək.

Newpid->numbers.nr = 0;
Tərtib et, işə sal

Valideynim PID284 Mənim PID 1517 Yeni PID 0
Beləliklə, PID 0 o qədər də xüsusi deyil? Sevinirik, çıxış yazırıq və...

Top gülləsi düşür! Nüvə bizim tapşırığımızı BÖLÜM TASK olaraq təyin etdi və tamamlandığını görərək, sadəcə çökdü. Görünür, proqramımız çıxmazdan əvvəl “normal” PID-ə qayıtmalıdır.

Görünməz proses

Koda qayıdaq və məşğul olmamaq üçün zəmanət verilən bir PID təyin edək
newpid->numbers.nr = 12345;

Tərtib et, işə sal

Valideynim PID296 Mənim PID 735 Yeni PID 12345
Gəlin /proc-da nə olduğuna baxaq

1 148 19 224 288 37 79 86 93 konsollar fb kcore kilidləri arakəsmələri dəyişdirmə versiyası 10 149 2 226 29 4 8 87 acpi cpuinfo fayl sistemləri açar istifadəçiləri meminfo sched_debug info vmallo sys v1002 5 8 asound kripto fs açarları misc schedstat sysrq- trigger vmstat 11 16 208 24 291 6 81 89 buddyinfo cihazları kmsg modullarını kəsir scsi sysvipc zoneinfo 12 17 21 25 296 7 82 9 avtobus diskləri iomem kpagecgroup mounts 16 73 self12 90 dma ioports 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 iş vaxtı
Gördüyümüz kimi, pulsuz PID-i tutsaq da, /proc prosesimizi müəyyən etmir. Əvvəlki PID də /proc-da deyil və bu çox qəribədir. Ola bilsin ki, biz fərqli ad məkanındayıq və buna görə də main /proc üçün görünmürük. Gəlin yeni /proc quraşdıraq və orada nə olduğunu görək

1 14 18 210 25 291 738 81 9 avtobus cihazları fs açar istifadəçiləri kilidlər pagetypeinfo softirqs timer_list 10 148 182 22 26 296 741 82 90 qruplar diskstatlar fasilələr bölmələri məlumatı stat192 30 76 83 92 cmdline dma iomem kmsg misc sched_debug dəyişdirmə iş vaxtı 11 15 2 224 28 37 78 84 93 config.gz driver ioports kpagecgroup modulları schedstat sys versiyası 12 16 20 226 288 4 79 85 acpi consoles mountsrqyssecc info 13 17 208 23 29 6 8 86 asound cpuinfo fb-kallsyms kpageflags mtrr self sysvipc vmstat 139 176 21 24 290 7 80 87 buddyinfo kripto fayl sistemləri kcore loadavg net slabinfo thread-self zoneinfo
Prosesimiz hələ də mövcud deyil, yəni normal ad məkanındayıq. yoxlayaq

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

Proqramı işə saldığımız yalnız bir bash. Nə əvvəlki PID, nə də cari siyahıda yoxdur.