Linux/Práce s procesy v Unixu
Základní informace
editovatKaždý proces, který je spuštěn, se stane potomkem (synovským procesem) procesu, který jej spustil. Většinou jsou procesy spouštěny z příkazového interpretu neboli shellu, stávají se tedy potomky shellu, který je jejich rodičem (parent).
Každý proces má určité atributy:
- PID – číslo procesu; toto číslo je unikátní v rámci celého systému
- PPID – číslo procesu rodiče (parent PID)
- vlastníka, tedy uživatele, který proces spustil
- terminál (TTY), na kterém je proces spuštěn. Proces nemusí mít terminál. Může běžet odpojeně od terminálu (dettached). To je typické u takzvaných démonů (deamon).
- priorita – proces má přidělenou svou prioritu. Je to číslo udávající, jak často proces dostane přidělen čas procesoru.
Příkaz ps
editovatPříkazem ps se zjišťují informace o právě běžících procesech. Příkaz ps bez parametrů vypíše procesy aktuálního uživatele běžící na aktuálním terminálu. Pro podrobnější informace můžeme za příkaz ps použít přepínač -l. Příkaz ps vypíše například údaje o UID (číslo vlastníka procesu), PID (číslo procesu), PPID (číslo rodičovského procesu), PRI (priorita procesu), stav procesu (běžící, spící, čekající na vstupně/výstupní operaci, zastavený, zombie), C (využití procesoru) apod. Příkaz ps má poměrně dost dalších přepínačů. Podrobnější informace lze dohledat v manuálových stránkách příkazu ps (man ps).
Priorita procesu
editovatUnix je víceúlohový systém. To samozřejmě ale neznamená, že všechny spuštěné procesy běží najednou, tedy že jsou ve stavu running. V unixu může v tomto stavu být pouze tolik procesů, kolik má počítač procesorů. Ostatní jsou ve stavu sleeping a čekají, až na ně přijde řada a procesor jim přidělí svůj čas. To, kdy a jak často na ně přijde řada, určuje plánovač procesů, který se řídí jejich prioritou. Nejvyšší priorita je 0. Prioritu můžeme měnit. Běžný uživatel může prioritu pouze snižovat. Uživatel root ji může i zvyšovat. Prioritu měníme pomocí příkazu nice. Nice – 10 prioritu o 10 sníží a nice - - 10 prioritu procesu o 10 zvýší.
Zasílání signálů
editovatPři práci se systémem Unix se můžeme dostat do situace, že některý spuštěný proces je potřeba ukončit. K ukončení procesů slouží příkaz kill. Přestože by se to podle názvu zdálo, kill není jen zabíječ procesů, ale zasílá jim signály. Signálů je celkem 32 a mají pevně daný význam. Na některé signály můžeme reakci procesu nastavit. Jiné signály mají pevně danou funkci, která je vynutitelná nebo proveditelná jádrem.
Nejdůležitější signály shrnuje tato tabulka
editovatČíslo | Název | Reakce | Význam |
---|---|---|---|
1 | SIGHUP | Exit | Zavěšení (Hang Up) |
2 | SIGINT | Exit | Přerušení (Interrupt) |
3 | SIGQUIT | Core | Ukončení |
4 | SIGILL | Core | Neplatná instrukce |
9 | SIGKILL | Exit | Okamžité ukončení |
11 | SIGSEGV | Core | Neplatný přístup do paměti |
15 | SIGTERM | Exit | Ukončení (Terminate) |
23 | SIGSTOP | Stop | Zastavení |
Odpojení procesu od terminálu
editovatVyužíváme ho v případě, kdy nechceme, aby skončil určitý proces v situaci, kdy jsme ukončili jeho rodičovský proces. V této situaci se dá využít příkaz nohup. Když je program spuštěn s tímto příkazem, zůstane běžet i ve chvíli, kdy skončí jeho rodičovský proces, a to tak, že se odpojí od terminálu. Jelikož je tento program odpojen od terminálu, nemůže na něj vypisovat svůj výstup. Ten je tedy přesměrován do souboru nohup.out.
Spuštění procesu v zadaný čas
editovatPro spuštění procesu v zadaný čas je možné využít příkaz at. K tomuto příkazu se jako parametr přidává požadovaný čas spuštění. Pro opakované spuštění je lepší využít příkaz cron.