Dari pertanyaan di sini , OP ingin berulang kali melakukan polling pada pid dari proses yang digunakan pidof
dalam skrip shell. Tentu saja ini tidak efisien karena proses baru harus dimulai untuk pidof
program beberapa kali per detik (saya tidak tahu bahwa ini adalah penyebab lonjakan CPU dalam pertanyaan, tetapi tampaknya mungkin).
Biasanya cara mengatasi hal semacam ini dalam skrip shell adalah bekerja dengan satu program yang menampilkan data yang Anda butuhkan stdout
dan kemudian melakukan beberapa pemrosesan teks jika perlu. Walaupun ini melibatkan lebih banyak program yang akan berjalan secara bersamaan, itu cenderung kurang intensif CPU karena proses-proses baru tidak secara terus-menerus dibuat untuk tujuan polling.
Jadi untuk pertanyaan di atas, salah satu solusinya mungkin memiliki beberapa program yang menampilkan nama dan pids dari proses saat mereka dibuat. Maka Anda dapat melakukan sesuatu seperti:
pids-names |
grep some_program |
cut -f 2 |
while read pid; do
process-pid "$pid"
done
Masalahnya adalah ini menimbulkan pertanyaan yang lebih mendasar, bagaimana bisa pid dan nama proses dicetak saat dibuat?
Saya telah menemukan sebuah program bernama ps-watcher
, meskipun masalah dengan ini adalah hanya sebuah perl
script yang berulang kali berjalan ps
sehingga tidak benar-benar menyelesaikan masalah. Pilihan lain adalah menggunakan auditd
yang mungkin bisa berfungsi jika log diproses langsung melalui tail -f
. Solusi ideal akan lebih sederhana dan lebih portabel daripada ini, meskipun saya akan menerima auditd
solusi jika itu adalah pilihan terbaik.
sumber
fork
atau varian), kemudian program baru mulai menggunakan anggotaexec
keluarga. Jadi, Anda mungkin ingin mencatatexec*
, bukanfork
.dbus
).Jawaban:
Jawaban khusus Linux:
perf-tools berisi execsnoop yang melakukan hal ini. Ini menggunakan berbagai fitur spesifik Linux seperti ftrace. Pada Debian, ini ada dalam paket perf-tools-unstable .
Contoh saya berjalan
man cat
di terminal lain:Saya ragu ada cara portabel untuk melakukan ini.
sumber
There Right Way TM dalam melakukan ini sangat tergantung pada sistem dan kernel yang Anda jalankan. DTrace harus bekerja pada Solaris, Free / NetBSD dan Linux.
Khusus untuk Linux, Anda dapat menggunakan ftrace (yang harus diaktifkan pada waktu kompilasi - biasanya) atau acara proc melalui netlink - lihat jawaban SO atas masalah untuk detail lebih lanjut (dan ingat untuk memilihnya, skor ~ 30 vs 0 untuk jawaban yang diterima terlihat lucu). Pelacak orang miskin mungkin dapat diimplementasikan dengan menggunakan
strace -eexec,fork
(meskipun dengan overhead tidak masuk akal).sumber