Voglio trovare il PID di tutti i processi che sono stati eseguiti da una chiamata cmdline che contiene una determinata stringa my_exec
.
Ad esempio, con macOS o Ubuntu, apri un terminale ed esegui /bin/bash
, quindi in un altro tipo di terminale ps all | grep '/bin/bash'
. Ti verrà richiesto con qualcosa del genere
501 2995 2366 0 31 0 4290112 1424 - Ss+ s000 0:00.01 /bin/bash --noediting -i
0 2316 2274 0 31 0 4349520 6376 - Ss s007 0:00.02 login -pfl my_username /bin/bash -c exec -la bash /bin/bash
0 2325 2274 0 31 0 4349520 6380 - Ss s008 0:00.02 login -pfl my_username /bin/bash -c exec -la bash /bin/bash
501 8246 2333 0 31 0 4279872 1520 - S+ s008 0:00.00 /bin/bash
501 8255 8248 0 31 0 4267768 888 - S+ s014 0:00.00 grep /bin/bash
La seconda colonna è il PID, quindi sarò in grado di farlo giocare con sed.
Con Ubuntu il formato dell'output è ps all
leggermente diverso, quindi si dovrebbero usare diverse chiamate sed, comunque è facile gestirlo.
Il problema è che tra le varie distro Linux il formato dell'output di ps
può essere completamente diverso. Ad esempio, questo è il caso di Alpine Linux, per il quale non sono nemmeno in grado di ottenere la colonna contenente il cmdline.
Cosa posso fare per avere un codice portatile? Forse esaminando manualmente i file /proc/<PID>/cmdline
(forse ci sono problemi con le autorizzazioni qui)?
Questo è il mio codice finora, per favore aiutatemi per l'altra parte.
if [ "$(uname)" == "Darwin" ]; then
pid=$(ps all|grep 'my_exec'|sed 's/^[[:space:]]*[a-z0-9]*//g'|sed 's/^[[:space:]]*\([0-9]*\)[^0-9].*/\1/g');
pid=$(echo $pid|xargs)
IFS=' ' read -r -a array <<< "$pid"
else
%portable code for various linux distros
fi