Cetak id dan nama proses saat dibuat


10

Dari pertanyaan di sini , OP ingin berulang kali melakukan polling pada pid dari proses yang digunakan pidofdalam skrip shell. Tentu saja ini tidak efisien karena proses baru harus dimulai untuk pidofprogram 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 stdoutdan 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 perlscript yang berulang kali berjalan pssehingga tidak benar-benar menyelesaikan masalah. Pilihan lain adalah menggunakan auditdyang mungkin bisa berfungsi jika log diproses langsung melalui tail -f. Solusi ideal akan lebih sederhana dan lebih portabel daripada ini, meskipun saya akan menerima auditdsolusi jika itu adalah pilihan terbaik.


1
Catatan tambahan yang menarik adalah bahwa pid pertama kali dibuat sebagai salinan dari proses pembuatan ( forkatau varian), kemudian program baru mulai menggunakan anggota execkeluarga. Jadi, Anda mungkin ingin mencatat exec*, bukan fork.
derobert

2
Satu-satunya cara efisien portabel yang saya tahu adalah menggunakan akuntansi proses Unix biasa, yang akan menulis catatan setelah proses keluar. Jika Anda ingin menangkap proses saat dibuat atau dilampaui, Anda mungkin perlu hal-hal khusus sistem seperti Linuxd audit, systemtap, atau dtrace.
Mark Plotnick

Jadi untuk pertanyaan di atas, salah satu solusinya mungkin memiliki beberapa program yang menampilkan nama dan pids dari proses saat mereka dibuat. - Seperti mereka diciptakan? Kedengarannya apa yang Anda pikirkan adalah pengamat (mereka menyebutnya di dunia browser web). Saya bertanya-tanya apakah Python akan cocok untuk bertindak sebagai "penjaga pintu"? Faktanya adalah bahwa Python dapat menggali sangat dalam ke dalam kerja sistem (misalnya dbus).
syntaxerror

1
@syntaxerror DBus jauh dari kerja sistem dalam hal ini - sebenarnya sekitar dua tingkat di atas apa yang sedang dibahas di sini.
peterph

OK, dalam istilah OSI tingkat yang dibahas di sini mungkin masih lebih rendah daripada dbus. Saya akui bahwa saya belum memikirkan secara mendalam apakah keduanya berada di tingkat yang sama atau tidak.
syntaxerror

Jawaban:


6

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 catdi terminal lain:

root@Zia:~# execsnoop 
TIME        PID   PPID ARGS
17:24:26  14189  12878 man cat 
17:24:26  14196  14189 tbl 
17:24:26  14195  14189 preconv -e UTF-8 
17:24:26  14199  14189 /bin/sh /usr/bin/nroff -mandoc -Tutf8 
17:24:26  14200  14189 less 
17:24:26  14201  14199 locale charmap 
17:24:26  14202  14199 groff -mtty-char -Tutf8 -mandoc 
17:24:26  14203  14202 troff -mtty-char -mandoc -Tutf8 
17:24:26  14204  14202 grotty 

Saya ragu ada cara portabel untuk melakukan ini.


2

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).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.