Pids ve işlem adlarını oluşturuldukları gibi yazdırın


10

Buradaki sorudan , OP pidofbir kabuk betiğinde kullanılan bir işlemin pid'ini tekrar tekrar yoklamak istiyor . Elbette bu, pidofprogram için saniyede birkaç kez yeni bir işlem başlatılması gerektiği için verimsizdir (bu sorunun CPU sivri uçlarının nedeni olduğunu bilmiyorum, ancak muhtemelen görünüyor).

Genellikle bir kabuk komut dosyasında bu tür bir şey, ihtiyacınız olan verileri çıktı tek bir program ile çalışmak stdoutve daha sonra gerekirse bazı metin işleme yapmaktır. Bu, eşzamanlı olarak daha fazla programın çalışmasını gerektirse de, yoklama amacıyla sürekli olarak yeni işlemler oluşturulmadığından CPU yoğunluğu daha düşük olacaktır.

Dolayısıyla yukarıdaki soru için, çözümlerden biri, oluşturuldukça süreçlerin adlarını ve pidlerini çıkaran bir programa sahip olmak olabilir. Sonra şöyle bir şey yapabilirsiniz:

pids-names |
  grep some_program |
  cut -f 2 |
  while read pid; do
    process-pid "$pid"
  done

Buradaki sorun, daha temel bir soru ortaya çıkarması, pids ve işlem adları oluşturuldukça nasıl yazdırılabilir?

ps-watcherBu sorun denilen bir program bulduk , ancak bu sorun sadece perltekrar tekrar çalışan bir komut dosyasıdır, bu psyüzden gerçekten sorunu çözmez. Başka bir seçenek, auditdgünlük doğrudan üzerinden işlendiğinde muhtemelen işe yarayabilecek bir yöntem kullanmaktır tail -f. İdeal bir çözüm bundan daha basit ve daha taşınabilir olacaktır, ancak auditden iyi seçenek ise bir çözümü kabul edeceğim .


1
İlginç bir yan not, pid'in ilk önce oluşturma işleminin ( veya varyantın) bir kopyası olarak yaratılmış olması fork, daha sonra yeni programın bir execailenin üyesi kullanılarak başlatılmasıdır . Yani muhtemelen exec*değil, giriş yapmak istiyorum fork.
derobert

2
Farkında olduğum tek taşınabilir verimli yol, bir işlemden sonra bir kayıt yazacak olan normal Unix işlem muhasebesini kullanmaktır . İşlemleri oluşturuldukları veya yürütüldükleri gibi yakalamak istiyorsanız, muhtemelen Linux auditd, systemtap veya dtrace gibi sisteme özgü şeylere ihtiyacınız vardır.
Mark Plotnick

Dolayısıyla yukarıdaki soru için, çözümlerden biri, oluşturuldukça süreçlerin adlarını ve pidlerini çıkaran bir programa sahip olmak olabilir. - Yaratıldıkları gibi mi? Düşündüğünüz şey bir gözlemcidir (buna web tarayıcısı dünyasında dedikleri şey budur). Python'un "kapı görevlisi" olarak davranmaya uygun olup olmadığını merak ediyorum. Gerçekler, Python'un sistemin iç işleyişini çok derinlemesine inceleyebilmesidir (örn. dbus).
sentaksör

1
@syntaxerror DBus, bu durumda sistemin iç çalışmasından çok uzaktır - aslında burada tartışılanın iki kat üzerindedir.
peterph

Tamam, OSI lingo'da burada tartışılan katman dbus'tan daha düşük olabilir. Her ikisinin de aynı seviyede olup olmadığını derinlemesine düşünmediğimi itiraf ediyorum.
sözdizimi

Yanıtlar:


6

Linux'a özel cevap:

perf-tools tam olarak bunu yapan bir execsnoop içerir . Ftrace gibi Linux'a özgü çeşitli özellikler kullanır. Debian'da, perf-tools-kararsız pakette.

Çalışan Mesela ben man catbaşka terminalde:

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 

Bunu yapmanın taşınabilir bir yolu olduğundan şüpheliyim.


2

Orada bunu doğru yolu TM aslında hangi sistem ve çekirdek üzerinde çalıştığına bağlıdır. DTrace Solaris, Free / NetBSD ve Linux üzerinde çalışmalıdır.

Özellikle Linux için, ftrace (derleme zamanında etkinleştirilmesi gerekir - genellikle öyle) veya netlink üzerinden proc olaylarını kullanabilirsiniz - daha fazla ayrıntı için sorunun SO yanıtına bakın (ve oy vermeyi unutmayın, puan ~ Kabul edilen cevap için 30'a karşı 0 komik görünüyor). Zavallı adamın izleyicisi muhtemelen strace -eexec,fork(mantıksız yükü olmasına rağmen) kullanılarak uygulanabilir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.