Linux: Bir sürecin nerede başladığını ve nasıl başladığını nasıl bilebilirim?


33

Bir Linux kutusunu kontrol ediyordum ve çalışan ve CPU kullanımı iyi bir pay alarak bir perl işlemi bulundu. İlk olarak, sadece işlem adına perl olabilir.

C tuşuna bastığımda , komut satırını görüntülemek için / var / spool / mail'i gösterdi. Bu mantıklı değil, çünkü bu dizin.

Benim sorularım:

1) Bu neden oldu? Bu perl işlemi komut satırını nasıl gizleyebilir? 2) Bir sürecin nerede ve nasıl başladığını bulmanın en güvenilir yolu nedir?

Teşekkürler!

Yanıtlar:


36

Çoğu durumda sadece yayın yapmak ps, genellikle geniş çıktılar elde etmek için favori bayraklarınızla birlikte yeterlidir. Doğru eğildim ps -feww, ancak buradaki diğer öneriler işe yarayacak. Bir program birinin programından çıkarılmışsa, $PATHtam yolu değil yalnızca çalıştırılabilir adını göreceğinizi unutmayın. Örneğin, şunu deneyin:

$ lftp &
$ ps -feww | grep ftp
lars      9600  9504  0 11:30 pts/10   00:00:00 lftp
lars      9620  9504  0 11:31 pts/10   00:00:00 grep ftp

psÇalışan program tarafından görünen bilgilerin tamamen üzerine yazılabileceğini not etmek önemlidir . Örneğin, bu kod:

int main (int argc, char **argv) {
        memset(argv[0], ' ', strlen(argv[0]));
        strcpy(argv[0], "foobar");
        sleep(30);
        return(0);
}

Bunu "myprogram" adlı bir dosyada derleyip çalıştırırsam:

$ gcc -o myprogram myprogram.c
$ ./myprogram &
[1] 10201

Ve sonra çalıştırın ps, farklı bir işlem adı göreceğim:

$ ps -f -p 10201
UID        PID  PPID  C STIME TTY          TIME CMD
lars     10201  9734  0 11:37 pts/10   00:00:00 foobar

Ayrıca /proc/<pid>/exe, doğrudan uygulanabilir dosyaya bakabilir ve bu da uygun yürütülebilir dosyaya bir bağlantı olabilir. Yukarıdaki örnekte, bu size aşağıdakilerden çok daha fazla yararlı bilgi verir ps:

$ls -l /proc/9600/exe
lrwxrwxrwx. 1 lars lars 0 Feb  8 11:31 /proc/9600/exe -> /usr/bin/lftp

1
hepsi bir arada, /procbir program hakkında tüm bilgileri sağlayacak, exeçalıştırılabilir, cwdmevcut çalışma dizinine bir link olacak , fddizin açık dosyalara bağlantılar (standart giriş, çıkış ve standart hata dahil) içerir
Hubert Kario

57

En güvenilir yol, /procişlemin direktörüne bakmaktır . Her işlem aşağıdaki /proc/<pid>/gibi bilgileri sakladığı bir dizine sahiptir :

  1. cwd mevcut çalışma dizinine bağlantı
  2. fd açık dosyalara bağlantılar içeren bir dir (dosya tanımlayıcıları)
  3. cmdline Süreci başlatmak için hangi komut satırının kullanıldığını görmek için oku
  4. environ bu işlem için ortam değişkenleri
  5. root Sürecin kök yönetimi olduğunu düşündüğü bir bağlantı (chrooted olmadıkça / olmadıkça)

Her süreç / proc hakkında daha fazla bilgi var, ancak yukarıdakilerle tam olarak ne olup bittiğini öğrenebileceksiniz.

Ayrıca, ps auxfsize kimin neyin yol açtığını göstererek perl'i kimin aradığı hakkında daha iyi bir fikir edinebilirsiniz.


Her zaman Windows'ta İşlem Gezgini'ni kullanıyorum ve Linux'ta bir eşdeğeri olup olmadığını merak ettim. Bu anahtar her şeyi yapıyor! ps auxf ... güzel!
Yanick Girouard

1
F parametresi için +1, bu benim için yaptı!
Lennart Rolland

2
Bana bu kadar temel bir kavram gibi görünen şeyleri öğretmek için +1 ... /procsüreç bilgisini içeriyor! kim biliyordu?? Tüm şimdiye kadar olduğu için orada baktım versionve cpuinfove şeyler ... artı benim asıl sorun bu çözer ps benim yönlendiricinin sürümü tüm parametreleri göz ardı çünkü
Nacht - Eski Monica

@ coredump: ve eğer işlem daha chroot()önce çağrılırsa , hangi dizine /proc/ᴘɪᴅ/cwdkarşılık geldiğini nasıl bilebilirim ?
user2284570

10

benim için, şimdi, pstreebunun bir sürecin nasıl başladığına dair daha net bir işaret verdiğini buldum.ps aux

şuna benziyor:

  ├─lightdm─┬─Xorg
  │         ├─lightdm─┬─init─┬─apache2───2*[apache2───26*[{apache2}]]
  │         │         │      ├─at-spi-bus-laun─┬─dbus-daemon
  │         │         │      │                 └─3*[{at-spi-bus-laun}]
  │         │         │      ├─at-spi2-registr───{at-spi2-registr}
  │         │         │      ├─dbus-daemon
  │         │         │      ├─dropbox───29*[{dropbox} ]

2

İşleminizin ps axww | grep perltam komut satırını almaya çalışın . Sadece topuzun bir çizgi kesilmiş gibi görünüyor .


2

Use komutunu deneyin fuser -vu /var/spool/mail Bu komut, belirtilen dosyaları veya dosya sistemlerini kullanan işlemlerin PID'lerini görüntüler. Varsayılan görüntüleme modunda, her dosya adını erişim türünü gösteren bir harf izler:

c - geçerli dizin e - çalıştırılabilir çalıştırma. f - dosyayı aç. Varsayılan ekran modunda f atlanır. r - kök dizini. m - mmap'lı dosya veya paylaşılan kütüphane.

Belki aradığınızı cevaplamak için aramanızı ilerletmenizde size yardımcı olacaktır. Size yardımcı olup olmadığını bilmiyorum ama belki bazı yararlı bilgiler bulacaksınız.


1

Kesin bayraklar için kılavuz sayfasına danışarak, komut satırının ve başlangıç ​​saatinin ne olduğunu finanse etmenin kolay bir yolu olarak, ps auxwww'nin çalışması gerekir. İstediğiniz takdirde man sayfasını okuyarak daha şık yapabilirsiniz.


1

Akla gelen iki komut:

1) ' ps ' işleminin başlangıç ​​zamanını alın .

$ ps -ax -o pid,start,comm
  PID  STARTED COMMAND         USER
    1   Feb 06 init            root
    2   Feb 06 kthreadd        root
[...]
  13147 19:09:48 chrome          hcooper
  13270 19:13:51 chrome          hcooper
  13386 19:18:34 bash            hcooper

2) lastcomm , şimdi kontrol ediyorum, yüklemedim . Her neyse, man sayfa açıklaması şöyle diyor:

   lastcomm prints out information about previously executed commands. If
   no arguments are specified, lastcomm will print info about all of the
   commands in acct (the record file).

Fakat birkaç kişinin söylediği gibi, "ls -al / proc /" size çok şey söyleyecektir!


0

kullanabilirsiniz:

systemctl status <PID>

veya işlemin adı ile:

systemctl status $(pgrep perl)

Bu işleminizi başlatan sistem hizmetleri hakkında bilgi sağlayacaktır.

Bu ipucunu burada buldum

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.