Potresti già conoscere il comando grep in Linux, che cerca un pattern e quindi stampa il testo corrispondente nell'output. Cosa succede se il requisito è applicare questo tipo di elaborazione per recuperare informazioni selezionate sui processi attualmente in esecuzione nel sistema?
Bene, sarai felice di sapere che esiste uno strumento da riga di comando - pgrep - che ti permette di fare esattamente questo. In questo tutorial, discuteremo le basi di pgrep usando alcuni esempi di facile comprensione. Ma prima di farlo, vale la pena ricordare che tutti gli esempi qui presenti sono stati testati su una macchina Ubuntu 20.04 LTS e su Debian 10.
Comando Linux pgrep
Il comando pgrep in Linux consente agli utenti di cercare i processi in base al nome e ad altri attributi. Di seguito è riportata la sua sintassi:
pgrep [options] pattern
Ed ecco come lo spiega la pagina man dello strumento:
pgrep looks through the currently running processes and lists the process IDs which match the
selection criteria to stdout. All the criteria have to match.
Di seguito sono riportati alcuni esempi in stile domande e risposte che dovrebbero darti una buona idea di come funziona il comando pgrep.
Q1. Come trovare l'ID di un processo di proprietà di un utente specifico?
Questo può essere fatto usando l'opzione della riga di comando -u. Ad esempio, per trovare l'ID del processo 'gedit' di proprietà dell'utente 'himanshu', usa pgrep nel modo seguente:
pgrep -u himanshu gedit
Ecco l'output prodotto da questo comando nel mio caso:
Q2. Come fare in modo che pgrep print contenga i processi di corrispondenza?
Nel caso in cui desideri che lo strumento stampi solo il conteggio e non gli ID stessi, utilizza l'opzione della riga di comando -c. Ad esempio, per conoscere il conteggio dei processi di proprietà dell'utente 'himanshu', esegui il seguente comando:
pgrep -c -u himanshu
Di seguito è riportato l'output prodotto da questo comando sul mio sistema:
83
T3. Come utilizzare un delimitatore personalizzato nell'output?
Per impostazione predefinita, gli ID di processo in output sono delimitati da una nuova riga. Tuttavia, se lo desideri, puoi modificare il delimitatore, cosa che puoi fare usando l'opzione -d della riga di comando.
Ad esempio, volevo usare i due punti (:) come delimitatore, quindi ho eseguito il comando pgrep nel modo seguente:
pgrep -u himanshu -d:
E di seguito è riportato l'output prodotto dal comando:
1793:1794:1807:1811:1813:1817:1820:1914:1917:1922:1925:1936:1938:1954:1974:1978:1980:1982:1993:1999
:2008:2009:2012:2020:2024:2034:2036:2043:2048:2049:2051:2052:2055:2064:2068:2073:2074:2085:2088:
2093:2094:2095:2098:2101:2104:2117:2125:2161:2162:2168:2173:2182:2201:2213:2233:2245:2266:2279:
2388:2409:2430:2456:2473:2564:2647:3085:3108:3178:3284:3297:3320:3325:3467:3487:3980:4040:4658:
5668:5721:5777:6271:6281:6512:6808
Q4. Come rendere la ricerca pgrep senza distinzione tra maiuscole e minuscole?
Per impostazione predefinita, la ricerca pgrep distingue tra maiuscole e minuscole. Tuttavia, se lo desideri, puoi renderlo senza distinzione tra maiuscole e minuscole. Per questo, devi usare l'opzione della riga di comando -i.
Ad esempio:
pgrep -i gedit
Q5. Come creare anche i nomi dei processi dell'elenco pgrep?
Per questo, usa l'opzione della riga di comando -l.
Ecco un esempio:
pgrep -u himanshu -l
Ecco un estratto dell'output prodotto sul mio sistema:
1793 systemd
1794 (sd-pam)
1807 gnome-keyring-d
1811 gdm-x-session
1813 Xorg
1817 dbus-daemon
1820 gnome-session-b
1914 ssh-agent
1917 gvfsd
1922 gvfsd-fuse
1925 at-spi-bus-laun
1936 dbus-daemon
1938 at-spi2-registr
1954 gnome-shell
1974 ibus-daemon
1978 ibus-dconf
1980 ibus-x11
1982 ibus-portal
1993 gnome-shell-cal
1999 evolution-sourc
2008 dconf-service
2009 gvfs-udisks2-vo
2012 goa-daemon
2020 gvfs-mtp-volume
2024 gvfs-goa-volume
...
...
...
Quindi puoi vedere che oltre agli ID di processo, nell'output sono stati prodotti anche i nomi di processo.
Q6. Come rendere anche il comando pgrep list completo?
Nel caso in cui desideri che pgrep visualizzi il comando completo utilizzato per avviare ciascun processo, utilizza l'opzione della riga di comando -a.
pgrep -u himanshu -a
1793 /lib/systemd/systemd --user
1794 (sd-pam)
1807 /usr/bin/gnome-keyring-daemon --daemonize --login
1811 /usr/lib/gdm3/gdm-x-session --run-script env GNOME_SHELL_SESSION_MODE=ubuntu gnome-session --session=ubuntu
1813 /usr/lib/xorg/Xorg vt2 -displayfd 3 -auth /run/user/1000/gdm/Xauthority -background none -noreset -keeptty -verbose 3
1817 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
1820 /usr/lib/gnome-session/gnome-session-binary --session=ubuntu
1914 /usr/bin/ssh-agent /usr/bin/im-launch env GNOME_SHELL_SESSION_MODE=ubuntu gnome-session --session=ubuntu
1917 /usr/lib/gvfs/gvfsd
1922 /usr/lib/gvfs/gvfsd-fuse /run/user/1000/gvfs -f -o big_writes
1925 /usr/lib/at-spi2-core/at-spi-bus-launcher
1936 /usr/bin/dbus-daemon --config-file=/usr/share/defaults/at-spi2/accessibility.conf --nofork --print-address 3
1938 /usr/lib/at-spi2-core/at-spi2-registryd --use-gnome-session
1954 /usr/bin/gnome-shell
1974 ibus-daemon --xim --panel disable
1978 /usr/lib/ibus/ibus-dconf
1980 /usr/lib/ibus/ibus-x11 --kill-daemon
1982 /usr/lib/ibus/ibus-portal
1993 /usr/lib/gnome-shell/gnome-shell-calendar-server
1999 /usr/lib/evolution/evolution-source-registry
2008 /usr/lib/dconf/dconf-service
2009 /usr/lib/gvfs/gvfs-udisks2-volume-monitor
2012 /usr/lib/gnome-online-accounts/goa-daemon
2020 /usr/lib/gvfs/gvfs-mtp-volume-monitor
2024 /usr/lib/gvfs/gvfs-goa-volume-monitor
2034 /usr/lib/gnome-online-accounts/goa-identity-service
2036 /usr/lib/gvfs/gvfs-gphoto2-volume-monitor
2043 /usr/lib/gvfs/gvfs-afc-volume-monitor
Q7. Come fare in modo che pgrep visualizzi solo il processo più recente?
Se invece di tutti i processi, vuoi che pgrep visualizzi solo il processo più recente, puoi farlo usando l'opzione -n della riga di comando.
Ecco un esempio:
pgrep -u himanshu -n -l
E di seguito è riportato l'output prodotto da questo comando:
7163 thunderbird
Posso confermare che Thunderbird è stato effettivamente il processo più recente lanciato dall'utente "himanshu".
Q8. Come fare in modo che pgrep visualizzi solo il processo più vecchio?
Per questo, usa l'opzione della riga di comando -o.
pgrep -u himanshu -o -l
Ed ecco l'output prodotto da questo comando:
1793 systemd
Conclusione
Quindi puoi vedere che pgrep è un comando estremamente utile. Una volta che hai finito di esercitarti sull'opzione della riga di comando di cui abbiamo discusso qui, puoi andare alla pagina man dello strumento per saperne di più.