# 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/)
