Linux: Bagaimana cara mengetahui di mana suatu proses dimulai dan bagaimana proses itu dimulai?


34

Saya memeriksa kotak Linux dan menemukan proses perl berjalan dan mengambil bagian yang baik dari penggunaan CPU. Dengan top, saya hanya bisa perl dalam nama proses.

Ketika saya menekan c , untuk melihat baris perintah, itu menunjukkan / var / spool / mail. Yang tidak masuk akal, karena ini adalah direktori.

Pertanyaan saya adalah:

1) Mengapa ini terjadi? Bagaimana proses perl ini bisa menutupi baris perintahnya? 2) Apa cara yang paling dapat diandalkan untuk mencari tahu di mana dan bagaimana suatu proses dimulai?

Terima kasih!

Jawaban:


36

Dalam kebanyakan kasus hanya menjalankan psbiasanya cukup, bersama dengan bendera favorit Anda untuk memungkinkan keluaran luas. Saya condong ke arah ps -feww, tetapi saran lain di sini akan berhasil. Perhatikan bahwa jika suatu program dimulai dari milik seseorang $PATH, Anda hanya akan melihat nama yang dapat dieksekusi, bukan path lengkap. Misalnya, coba ini:

$ 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

Penting untuk dicatat bahwa informasi yang terlihat di psdapat sepenuhnya ditimpa oleh program yang sedang berjalan. Misalnya, kode ini:

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

Jika saya mengompilasi ini menjadi file yang disebut "myprogram" dan jalankan:

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

Dan kemudian jalankan ps, saya akan melihat nama proses yang berbeda:

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

Anda juga dapat melihat secara langsung /proc/<pid>/exe, yang mungkin merupakan symlink ke executable yang sesuai. Dalam contoh di atas, ini memberi Anda informasi yang jauh lebih berguna daripada ps:

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

1
semua, dalam semua, file dalam /procakan memberikan semua informasi tentang suatu program, exeakan menjadi tautan ke executable, cwdke direktori kerja saat ini, fddirektori berisi tautan untuk membuka file (termasuk input standar, output dan kesalahan standar)
Hubert Kario

57

Cara yang paling dapat diandalkan adalah dengan melihat /procdir untuk proses tersebut. Setiap proses memiliki /proc/<pid>/direktori tempat menyimpan informasi seperti:

  1. cwd tautan ke direktori kerja saat ini
  2. fd dir dengan tautan ke file yang terbuka (deskriptor file)
  3. cmdline baca untuk melihat baris perintah apa yang digunakan untuk memulai proses
  4. environ variabel lingkungan untuk proses itu
  5. root tautan ke proses yang dianggap sebagai dir root (akan / kecuali chroot)

Ada lebih banyak info keren pada setiap proses / proc, tetapi dengan yang di atas Anda akan dapat tahu persis apa yang sedang terjadi.

Juga, menggunakan ps auxfakan menunjukkan Anda yang bercabang apa sehingga Anda bisa mendapatkan ide yang lebih baik siapa yang memanggil perl Anda.


Saya selalu menggunakan Process Explorer di Windows dan bertanya-tanya apakah ada yang setara di Linux. Pergantian itu melakukan semuanya! ps ayo ... bagus!
Yanick Girouard

1
+1 untuk parameter f untuk ps, yang melakukannya untuk saya!
Lennart Rolland

2
+1 untuk mengajari saya apa yang tampaknya seperti konsep mendasar ... /procberisi informasi proses! siapa yang tahu?? semua yang pernah saya cari di sana adalah versiondan cpuinfodan hal-hal ... ditambah ini menyelesaikan masalah saya yang sebenarnya karena versi ps router saya mengabaikan semua parameter
Nacht - Reinstate Monica

@coredump: dan jika prosesnya dipanggil chroot()sebelumnya, bagaimana saya bisa tahu direktori mana yang /proc/ᴘɪᴅ/cwdsesuai?
user2284570

10

Bagi saya, baru saja, saya menemukan bahwa pstreememberikan indikasi yang lebih jelas tentang bagaimana suatu proses dimulai, daripadaps aux

terlihat seperti ini:

  ├─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

Cobalah ps axww | grep perluntuk mendapatkan baris perintah lengkap dari proses Anda. Sepertinya tophanya memotong garis panjang.


2

Coba gunakan perintah Perintah fuser -vu /var/spool/mail ini akan menampilkan kepada Anda PID proses menggunakan file atau sistem file yang ditentukan. Dalam mode tampilan default, setiap nama file diikuti oleh huruf yang menunjukkan jenis akses:

c - direktori saat ini. e - executable sedang dijalankan. f - buka file. f dihilangkan dalam mode tampilan default. direktori r - root. file m-mmap'ed atau pustaka bersama.

Mungkin itu akan membantu Anda untuk maju mencari untuk menjawab yang Anda cari. Saya tidak tahu apakah itu membantu Anda, tetapi mungkin Anda akan menemukan beberapa informasi yang berguna.


1

Tanpa berkonsultasi dengan halaman manual untuk flag yang tepat, cara mudah untuk mendanai apa baris perintah dan waktu mulai, ps auxwww harus bekerja. Anda dapat membuatnya lebih elegan jika diinginkan dengan membaca halaman manual.


1

Dua perintah muncul dalam pikiran:

1) dapatkan waktu mulai untuk proses keluar dari ' ps '.

$ 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 , yang sekarang saya periksa, saya belum menginstal. Bagaimanapun deskripsi halaman manual mengatakan:

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

Tetapi seperti yang dikatakan beberapa orang, "ls -al / proc /" akan memberitahumu banyak hal!


0

Anda dapat gunakan:

systemctl status <PID>

atau dengan nama proses:

systemctl status $(pgrep perl)

Ini akan memberikan informasi tentang layanan systemd yang memulai proses Anda.

Saya menemukan petunjuk ini di sini

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.