mywiki/linux/processes.md

273 lines
10 KiB
Markdown

# Monitorare i processi di sistema
Il comando `ps` visualizza un elenco dei processi avviati dall'utente che ha eseguito il comando.
```bash
ps
PID TTY TIME CMD
59401 pts/2 00:00:00 bash
59409 pts/2 00:00:00 ps
```
Le quattro colonne sono:
- `PID`: il numero ID del processo;
- `TTY`: il nome della shell a cui l'utente è connesso;
- `TIME`: il tempo di elaborazione della CPU utilizzato dal processo;
- `CMD`: il nome del comando che ha avviato il processo
Con l'opzione `-e` vengono elencati i processi di tutti gli utenti:
```bash
ps -e | less
PID TTY TIME CMD
1 ? 00:00:02 systemd
2 ? 00:00:00 kthreadd
3 ? 00:00:00 rcu_gp
4 ? 00:00:00 rcu_par_gp
5 ? 00:00:00 slub_flushwq
6 ? 00:00:00 netns
8 ? 00:00:00 kworker/0:0H-events_highpri
10 ? 00:00:00 mm_percpu_wq
11 ? 00:00:00 rcu_tasks_kthread
12 ? 00:00:00 rcu_tasks_rude_kthread
13 ? 00:00:00 rcu_tasks_trace_kthread
14 ? 00:00:00 ksoftirqd/0
15 ? 00:00:16 rcu_preempt
```
## Gerarchia dei processi
È possibile vedere quali processi ne hanno avviati altri con l'opzione `-H` (hierarchy). La rientranza indica i processi figli:
```bash
ps -eH | less
PID TTY TIME CMD
945 ? 00:00:00 sddm
971 tty7 00:13:47 Xorg
1398 ? 00:00:00 sddm-helper
1431 ? 00:00:00 startplasma-x11
1507 ? 00:00:00 ssh-agent
1618 ? 00:00:00 plasma_session
1658 ? 00:08:12 kwin_x11
1694 ? 00:00:03 ksmserver
1718 ? 00:03:31 plasmashell
1720 ? 00:00:03 kaccess
1721 ? 00:00:01 xembedsniproxy
1722 ? 00:00:03 org_kde_powerde
1723 ? 00:00:02 polkit-kde-auth
1737 ? 00:00:01 gmenudbusmenupr
1742 ? 00:00:03 DiscoverNotifie
1758 ? 00:00:02 kalendarac
1763 ? 00:00:10 nextcloud
1773 ? 00:00:00 agent
956 ? 00:00:00 sshd
```
L'opzione `--forest` aggiunge chiarezza nella visualizzazione della parentela:
```bash
ps -eH --forest | less
PID TTY TIME CMD
945 ? 00:00:00 sddm
971 tty7 00:13:54 \_ Xorg
1398 ? 00:00:00 \_ sddm-helper
1431 ? 00:00:00 \_ startplasma-x11
1507 ? 00:00:00 \_ ssh-agent
1618 ? 00:00:00 \_ plasma_session
1658 ? 00:08:17 \_ kwin_x11
1694 ? 00:00:03 \_ ksmserver
1718 ? 00:03:34 \_ plasmashell
1720 ? 00:00:03 \_ kaccess
1721 ? 00:00:02 \_ xembedsniproxy
1722 ? 00:00:03 \_ org_kde_powerde
1723 ? 00:00:02 \_ polkit-kde-auth
1737 ? 00:00:02 \_ gmenudbusmenupr
1742 ? 00:00:03 \_ DiscoverNotifie
1758 ? 00:00:02 \_ kalendarac
1763 ? 00:00:10 \_ nextcloud
1773 ? 00:00:00 \_ agent
956 ? 00:00:00 sshd
```
## Ottenere più informazioni
Utilizzando l'opzione `-F` (extra full-format) vengono mostrate più colonne e quindi maggiori informazioni:
```bash
UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
root 1 0 0 44388 11208 1 08:14 ? 00:00:02 /lib/systemd/systemd splash --system --deserialize 17
root 2 0 0 0 0 1 08:14 ? 00:00:00 [kthreadd]
root 3 2 0 0 0 0 08:14 ? 00:00:00 [rcu_gp]
root 4 2 0 0 0 0 08:14 ? 00:00:00 [rcu_par_gp]
root 5 2 0 0 0 0 08:14 ? 00:00:00 [slub_flushwq]
root 6 2 0 0 0 0 08:14 ? 00:00:00 [netns]
root 8 2 0 0 0 0 08:14 ? 00:00:00 [kworker/0:0H-events_highpri]
root 10 2 0 0 0 0 08:14 ? 00:00:00 [mm_percpu_wq]
root 11 2 0 0 0 0 08:14 ? 00:00:00 [rcu_tasks_kthread]
root 12 2 0 0 0 0 08:14 ? 00:00:00 [rcu_tasks_rude_kthread]
root 13 2 0 0 0 0 08:14 ? 00:00:00 [rcu_tasks_trace_kthread]
root 14 2 0 0 0 0 08:14 ? 00:00:01 [ksoftirqd/0]
root 15 2 0 0 0 2 08:14 ? 00:00:17 [rcu_preempt]
root 16 2 0 0 0 0 08:14 ? 00:00:00 [migration/0]
root 18 2 0 0 0 0 08:14 ? 00:00:00 [cpuhp/0]
root 19 2 0 0 0 1 08:14 ? 00:00:00 [cpuhp/1]
```
Le colonne visualizzate ora sono:
- `UID`: l'ID utente del proprietario del processo;
- `PID`: l'ID del processo;
- `PPID`: ID del processo genitore;
- `C`: il numero di figli;
- `PSR`: il processore (cpu) a cui è assegnato il processo;
- `STIME`: ora di inizio. Il momento in cui è iniziato il processo;
- `TTY`: il nome della shell a cui l'utente è connesso;
- `TIME`: il tempo di elaborazione della CPU utilizzato dal processo;
- `CMD`: il nome del comando che ha avviato il processo
## Vedere processi di un particolare utente
Per vedere i processi di un particolare utente:
```bash
ps -u davide
PID TTY TIME CMD
1400 ? 00:00:00 systemd
1401 ? 00:00:00 (sd-pam)
1417 ? 00:00:13 pipewire
1418 ? 00:00:01 wireplumber
1419 ? 00:00:15 pipewire-pulse
1420 ? 00:00:12 dbus-daemon
1430 ? 00:00:02 kwalletd5
1431 ? 00:00:00 startplasma-x11
1507 ? 00:00:00 ssh-agent
1524 ? 00:01:03 ibus-daemon
1527 ? 00:00:00 ibus-dconf
1529 ? 00:00:10 ibus-ui-gtk3
1530 ? 00:00:09 ibus-extension-
1532 ? 00:00:00 ibus-x11
1537 ? 00:00:00 ibus-portal
1557 ? 00:00:00 at-spi-bus-laun
1563 ? 00:00:01 dbus-daemon
1573 ? 00:00:05 at-spi2-registr
1582 ? 00:00:10 ibus-engine-sim
1618 ? 00:00:00 plasma_session
1622 ? 00:00:00 start_kdeinit
1623 ? 00:00:00 kdeinit5
1624 ? 00:00:02 klauncher
1658 ? 00:08:31 kwin_x11
1679 ? 00:00:05 kglobalaccel5
1691 ? 00:00:00 dconf-service
1694 ? 00:00:03 ksmserver
```
## Ordinare i processi
Con l'opzione `-o` è possibile selezionare le colonne che si desidera includere nell'output del comando `ps`, mentre l'opzione `--sort` permette di ordinare l'output in base al parametro specificato:
```bash
ps -eo pid,pcpu,pmem,args --sort -pcpu,pmem | head -10
PID %CPU %MEM COMMAND
59079 9.0 0.3 vim processes.md
59118 7.6 4.2 $HOME/.config/coc/extensions/node_modules/coc-ltex/lib/ltex-ls-15.2.0/jdk-11.0.12+7/bin/java -Xms64m -Xmx512m -classpath $HOME/.config/coc/extensions/node_modules/coc-ltex/lib/ltex-ls-15.2.0/etc:$HOME/.config/coc/extensions/node_modules/coc-ltex/lib/ltex-ls-15.2.0/lib/* -Dapp.name=ltex-ls -Dapp.pid=59118 -Dapp.repo=$HOME/.config/coc/extensions/node_modules/coc-ltex/lib/ltex-ls-15.2.0/lib -Dapp.home=$HOME/.config/coc/extensions/node_modules/coc-ltex/lib/ltex-ls-15.2.0 -Dbasedir=$HOME/.config/coc/extensions/node_modules/coc-ltex/lib/ltex-ls-15.2.0 org.bsplines.ltexls.LtexLanguageServerLauncher
26789 4.6 4.0 /usr/lib/firefox-esr/firefox-esr
59080 3.3 1.4 node --no-warnings $HOME/.vim/bundle/coc.nvim/build/index.js
971 2.8 0.7 /usr/lib/xorg/Xorg -nolisten tcp -auth /var/run/sddm/{49eaf0ba-ce00-4efc-8197-fdf9e6e8c827} -background none -noreset -displayfd 17 -seat seat0 vt7
1658 1.7 0.7 /usr/bin/kwin_x11
26918 1.0 2.0 /usr/lib/firefox-esr/firefox-esr -contentproc -childID 1 -isForBrowser -prefsLen 34960 -prefMapSize 222095 -jsInitLen 277276 -parentBuildID 20230214011352 -appDir /usr/lib/firefox-esr/browser 26789 true tab
32110 1.0 4.4 /usr/bin/telegram-desktop --
58902 0.8 1.3 /usr/lib/firefox-esr/firefox-esr -contentproc -childID 170 -isForBrowser -prefsLen 41310 -prefMapSize 222095 -jsInitLen 277276 -parentBuildID 20230214011352 -appDir /usr/lib/firefox-esr/browser 26789 true tab
```
## Ricercare un processo
Come il comando grep è utilizzato per trovare stringhe da file ed output, il comando `pgrep` fa lo stesso per i processi.
La sintassi è molto semplice
```bash
pgrep -i -u username process_name
```
dove `-i` attiva l'opzione **case-insensitive**.
### Ottenere il numero di processi di un utente
Per conoscere il numero di processi utilizzati da un utente specifico, utilizzare l'opzione `-c`:
```bash
pgrep -cu davide
112
```
Ad esempio:
```bash
> pgrep -u davide -l
1400 systemd
1401 (sd-pam)
1417 pipewire
1418 wireplumber
1419 pipewire-pulse
1420 dbus-daemon
1430 kwalletd5
1431 startplasma-x11
```
Per trovare quale comando ha avviato il processo in questione basta digitare
```bash
pgrep -u username -a
> pgrep -u davide -a
1400 /lib/systemd/systemd --user
1401 (sd-pam)
1417 /usr/bin/pipewire
1418 /usr/bin/wireplumber
1419 /usr/bin/pipewire-pulse
1420 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
1430 /usr/bin/kwalletd5 --pam-login 7 8
1431 /usr/bin/startplasma-x11
```
### Elencare i processi per nome e PID
```bash
pgrep -u username -l
```
## Uccidere un processo
### Tramite PID
Se, per esempio, si volesse uccidere il processo 1492:
```bash
sudo kill -9 1492
```
### Tramite il nome
```bash
sudo pkill -9 top
```
### Uccidere processi multipli
```bash
sudo killall -9 top
```
## Collegamenti
- [https://www.howtogeek.com/448271/how-to-use-the-ps-command-to-monitor-linux-processes/](https://www.howtogeek.com/448271/how-to-use-the-ps-command-to-monitor-linux-processes/)
- [https://www.howtogeek.com/413213/how-to-kill-processes-from-the-linux-terminal/](https://www.howtogeek.com/413213/how-to-kill-processes-from-the-linux-terminal/)
- [https://linuxhandbook.com/pgrep/](https://linuxhandbook.com/pgrep/)