Saya ingin menemukan PID dari semua proses yang dijalankan oleh panggilan cmdline yang berisi string tertentu my_exec
.
Misalnya, dengan macOS atau Ubuntu, buka terminal dan jalankan /bin/bash
, dan kemudian dalam jenis terminal lain ps all | grep '/bin/bash'
. Anda akan diminta dengan sesuatu seperti ini
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
Kolom kedua adalah PID jadi saya akan bisa membuatnya bermain dengan sed.
Dengan Ubuntu format outputnya ps all
sedikit berbeda, jadi orang harus menggunakan panggilan sed yang berbeda, toh mudah menangani hal ini.
Masalahnya adalah bahwa di antara berbagai distro Linux format output ps
bisa sangat berbeda. Sebagai contoh, ini adalah kasus Alpine Linux, di mana saya bahkan tidak bisa mendapatkan kolom yang berisi cmdline.
Apa yang dapat saya lakukan untuk memiliki kode portabel? Mungkin memeriksa file secara manual /proc/<PID>/cmdline
(mungkin ada masalah izin di sini)?
Ini adalah kode saya sejauh ini, tolong bantu saya untuk bagian lain.
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
Saya berakhir dengan kode ini, pada dasarnya itu mempertimbangkan semua proses dalam
/proc/
, mencari konten/proc/<PID>/cmdline
dan memeriksa apakah dalam string yang adamy_exec
sebagai substring.Perhatikan penggunaan
tr
untuk mem-parsing kontencmdline
untuk mengubah\0
string -separated menjadi string yang dipisahkan oleh spasi.sumber