Linux: Làm thế nào để biết một quá trình được bắt đầu từ đâu và nó đã được bắt đầu như thế nào?


33

Tôi đã kiểm tra một hộp Linux và thấy một quy trình perl đang chạy và chia sẻ tốt việc sử dụng cpu. Với đầu trang, tôi chỉ có thể perl trong tên quá trình.

Khi tôi nhấn c , để xem dòng lệnh, nó hiển thị / var / spool / mail. Điều này không có ý nghĩa, vì đây là thư mục.

Câu hỏi của tôi là:

1) Tại sao điều này xảy ra? Làm thế nào quá trình perl này có thể che dấu dòng lệnh của nó? 2) Cách đáng tin cậy nhất để tìm ra nơi và làm thế nào một quá trình đã được bắt đầu?

Cảm ơn!

Câu trả lời:


36

Trong hầu hết các trường hợp, chỉ cần chạy psthường là đủ, cùng với các cờ yêu thích của bạn để cho phép đầu ra rộng. Tôi nghiêng về phía ps -feww, nhưng những gợi ý khác ở đây sẽ hoạt động. Lưu ý rằng nếu một chương trình được bắt đầu từ một ai đó $PATH, bạn sẽ chỉ thấy tên thực thi, không phải là đường dẫn đầy đủ. Ví dụ: thử điều này:

$ 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

Điều quan trọng cần lưu ý là thông tin hiển thị trong pscó thể được ghi đè hoàn toàn bởi chương trình đang chạy. Ví dụ: mã này:

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

Nếu tôi biên dịch nó thành một tệp có tên là "myprogram" và chạy nó:

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

Và sau đó chạy ps, tôi sẽ thấy một tên quy trình khác:

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

Bạn cũng có thể nhìn trực tiếp vào /proc/<pid>/exe, đây có thể là một liên kết tượng trưng để thực thi thích hợp. Trong ví dụ trên, điều này cung cấp cho bạn thông tin hữu ích hơn nhiều so với ps:

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

1
tất cả, tất cả, các tệp trong /procsẽ cung cấp tất cả thông tin về một chương trình, exesẽ là một liên kết đến thực thi, cwdthư mục làm việc hiện tại, fdthư mục chứa các liên kết đến các tệp đang mở (bao gồm đầu vào tiêu chuẩn, đầu ra và lỗi tiêu chuẩn)
Hubert Kario

57

Cách đáng tin cậy nhất là nhìn vào /procdir cho quá trình. Mỗi quá trình có một /proc/<pid>/thư mục lưu giữ thông tin như:

  1. cwd liên kết đến thư mục làm việc hiện tại
  2. fd một thư mục có liên kết đến các tệp đang mở (mô tả tệp)
  3. cmdline đọc nó để xem dòng lệnh nào đã được sử dụng để bắt đầu quá trình
  4. environ các biến môi trường cho quá trình đó
  5. root một liên kết đến những gì quá trình coi là thư mục gốc của nó (nó sẽ là / trừ khi bị chroot)

Có nhiều thông tin thú vị hơn về mỗi quy trình / Proc, nhưng với những thông tin trên, bạn sẽ có thể biết chính xác những gì đang diễn ra.

Ngoài ra, việc sử dụng ps auxfsẽ cho bạn thấy ai đã rẽ nhánh những gì để bạn có thể biết được ai đang gọi perl của bạn.


Tôi luôn sử dụng Process Explorer trên Windows và tự hỏi liệu có tương đương trên Linux không. Công tắc đó làm tất cả! ps phụ ... thật tuyệt!
Yanick Girouard

1
+1 cho tham số f cho ps, điều đó đã giúp tôi!
Lennart Rolland

2
+1 để dạy tôi những gì có vẻ giống như một khái niệm cơ bản như vậy ... /procchứa thông tin về quy trình! Ai biết?? tất cả những gì tôi từng tìm kiếm ở đó là versioncpuinfomọi thứ ... cộng với điều này giải quyết vấn đề thực sự của tôi bởi vì phiên bản ps của bộ định tuyến của tôi bỏ qua tất cả các tham số
Nacht - Rebstate Monica

@coredump: và nếu quá trình được gọi chroot()trước đó, làm thế nào tôi có thể biết thư mục nào /proc/ᴘɪᴅ/cwdtương ứng với?
dùng2284570

10

đối với tôi, ngay bây giờ, tôi thấy rằng pstreeđã cho thấy một dấu hiệu rõ ràng hơn nhiều về cách một quá trình đã được bắt đầu, hơnps aux

nó trông như thế này:

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

Cố gắng ps axww | grep perlđể có được dòng lệnh đầy đủ của quá trình của bạn. Có vẻ như topchỉ cần cắt một đường dài.


2

Thử sử dụng lệnh Lệnh fuser -vu /var/spool/mail này sẽ hiển thị cho bạn các quy trình PID bằng cách sử dụng các tệp hoặc hệ thống tệp được chỉ định. Trong chế độ hiển thị mặc định, mỗi tên tệp được theo sau bởi một chữ cái biểu thị loại quyền truy cập:

c - thư mục hiện tại. e - thực thi được chạy. f - mở tập tin. f được bỏ qua trong chế độ hiển thị mặc định. r - thư mục gốc. tập tin m - mmap'ed hoặc thư viện chia sẻ.

Có lẽ nó sẽ giúp bạn tiến về phía trước tìm kiếm của bạn để trả lời bạn đang tìm kiếm. Tôi không biết nếu nó giúp bạn nhưng có lẽ bạn sẽ tìm ra một số thông tin hữu ích.


1

Wihtout tư vấn trang man cho các cờ chính xác, một cách dễ dàng để tài trợ cho dòng lệnh và thời gian bắt đầu là gì, ps auxwww nên hoạt động. Bạn có thể làm cho nó thanh lịch hơn nếu muốn bằng cách đọc trang người đàn ông.


1

Hai lệnh mùa xuân đến trong tâm trí:

1) lấy thời gian bắt đầu cho quá trình ra khỏi ' 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 , mà bây giờ tôi kiểm tra, tôi chưa cài đặt. Dù sao mô tả trang người đàn ông nói:

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

Nhưng như một vài người đã nói, "ls -al / Proc /" sẽ cho bạn biết rất nhiều!


0

bạn có thể dùng:

systemctl status <PID>

hoặc với tên của quá trình:

systemctl status $(pgrep perl)

Điều này sẽ cung cấp thông tin về các dịch vụ systemd đã bắt đầu quá trình của bạn.

Tôi tìm thấy gợi ý này ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.