Linux: จะทราบได้อย่างไรว่ากระบวนการเริ่มต้นที่ใดและกระบวนการเริ่มต้นอย่างไร


33

ฉันตรวจสอบกล่อง Linux และพบว่ากระบวนการ Perl ทำงานอยู่และรับส่วนแบ่งการใช้งาน cpu ที่ดี ด้วยด้านบนฉันสามารถทำได้เฉพาะในชื่อกระบวนการ

เมื่อฉันกดcเพื่อดูบรรทัดคำสั่งมันแสดง / var / spool / mail ซึ่งไม่สมเหตุสมผลเนื่องจากนี่เป็นไดเรกทอรี

คำถามของฉันคือ:

1) ทำไมสิ่งนี้จึงเกิดขึ้น วิธีการที่ perl นี้สามารถปกปิดบรรทัดคำสั่งได้อย่างไร 2) วิธีใดที่เชื่อถือได้มากที่สุดในการค้นหาว่ากระบวนการเริ่มต้นจากที่ใดและอย่างไร

ขอบคุณ!

คำตอบ:


36

ในกรณีส่วนใหญ่เพียงแค่เรียกใช้psมักจะเพียงพอพร้อมกับธงที่คุณชื่นชอบเพื่อเปิดใช้งานการส่งออกกว้าง ฉันเอนไปทางps -fewwแต่คำแนะนำอื่น ๆ ที่นี่จะใช้ได้ โปรดทราบว่าหากโปรแกรมเริ่มต้นจากบางคน$PATHคุณจะเห็นชื่อที่สามารถใช้งานได้เท่านั้นไม่ใช่เส้นทางแบบเต็ม ตัวอย่างเช่นลองสิ่งนี้:

$ 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สามารถเขียนทับได้อย่างสมบูรณ์โดยโปรแกรมที่กำลังทำงานอยู่ ตัวอย่างเช่นรหัสนี้:

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

ถ้าฉันรวบรวมมันเป็นไฟล์ที่เรียกว่า "myprogram" และเรียกใช้:

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

จากนั้นเรียกใช้psฉันจะเห็นชื่อกระบวนการอื่น:

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

นอกจากนี้คุณยังสามารถดูได้โดยตรง/proc/<pid>/exeซึ่งอาจเป็นลิงค์ไปยังปฏิบัติการที่เหมาะสม ในตัวอย่างด้านบนสิ่งนี้ให้ข้อมูลที่เป็นประโยชน์มากกว่าps:

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

1
ทั้งหมดในทุกไฟล์ใน/procจะให้ข้อมูลทั้งหมดเกี่ยวกับโปรแกรมexeจะเป็นลิงค์ไปยังปฏิบัติการcwdไดเรกทอรีไดเรกทอรีทำงานปัจจุบันfdมีลิงค์ไปยังไฟล์ที่เปิด (รวมถึงการป้อนข้อมูลมาตรฐานเอาท์พุทและข้อผิดพลาดมาตรฐาน)
Hubert Kario

57

วิธีที่น่าเชื่อถือที่สุดคือการดู/procdir สำหรับกระบวนการ แต่ละกระบวนการมี/proc/<pid>/ไดเรกทอรีที่เก็บข้อมูลเช่น:

  1. cwd เชื่อมโยงไปยังไดเรกทอรีการทำงานปัจจุบัน
  2. fd dir ที่มีลิงก์ไปยังไฟล์ที่เปิดอยู่ (file descriptors)
  3. cmdline อ่านเพื่อดูว่าบรรทัดคำสั่งใดที่ใช้เพื่อเริ่มกระบวนการ
  4. environ ตัวแปรสภาวะแวดล้อมสำหรับกระบวนการนั้น
  5. root ลิงก์ไปยังสิ่งที่กระบวนการพิจารณาว่าเป็น root dir (จะเป็น / ยกเว้น chrooted)

มีข้อมูลที่ยอดเยี่ยมกว่าในแต่ละกระบวนการ / proc แต่ด้วยสิ่งที่กล่าวมาข้างต้นคุณจะสามารถรู้ได้อย่างชัดเจนว่าเกิดอะไรขึ้น

นอกจากนี้การใช้ps auxfจะแสดงให้คุณเห็นว่าใครแยกแยะสิ่งที่คุณอาจได้รับความคิดที่ดีกว่าว่าใครกำลังโทรหา Perl ของคุณ


ฉันใช้ Process Explorer บน Windows เสมอและสงสัยว่ามี Linux เท่ากันหรือไม่ สวิตช์นั้นทำได้ทั้งหมด! ps auxf ... ดี!
Yanick Girouard

1
+1 สำหรับพารามิเตอร์ f สำหรับ ps นั่นทำเพื่อฉัน!
Lennart Rolland

2
+1 สำหรับการสอนฉันสิ่งที่ดูเหมือนเป็นแนวคิดพื้นฐานดังกล่าว ... /procมีข้อมูลกระบวนการ! ใครจะรู้ ?? ทั้งหมดที่ฉันเคยดูที่นั่นเป็นversionและcpuinfoสิ่งต่าง ๆ ... บวกกับสิ่งนี้แก้ปัญหาที่เกิดขึ้นจริงของฉันเพราะรุ่นของเราเตอร์ของฉันไม่สนใจพารามิเตอร์ทั้งหมด
Nacht - Reinstate Monica

@coredump: และหากกระบวนการที่เรียกchroot()ก่อนหน้านี้ฉันจะทราบได้อย่างไรว่าไดเรกทอรีใด/proc/ᴘɪᴅ/cwdสอดคล้องกับ
user2284570

10

สำหรับฉันตอนนี้ฉันพบว่าpstreeมีข้อบ่งชี้ที่ชัดเจนมากขึ้นว่ากระบวนการเริ่มต้นอย่างไรps aux

ดูเหมือนว่านี้:

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

ลองps axww | grep perlรับบรรทัดคำสั่งแบบเต็มของกระบวนการของคุณ ดูเหมือนว่าtopจะตัดแต่งเส้นยาว ๆ


2

ลองใช้คำสั่งคำสั่ง fuser -vu /var/spool/mail นี้จะแสดง PID ของกระบวนการโดยใช้ไฟล์ที่ระบุหรือระบบไฟล์ ในโหมดการแสดงผลเริ่มต้นชื่อไฟล์แต่ละชื่อจะตามด้วยตัวอักษรเพื่อระบุประเภทการเข้าถึง:

c - ไดเรกทอรีปัจจุบัน e - executable กำลังทำงานอยู่ f - เปิดไฟล์ f ถูกละไว้ในโหมดการแสดงผลเริ่มต้น ไดเรกทอรีราก m - ไฟล์ mmap'ed หรือไลบรารีที่แชร์

บางทีมันอาจช่วยให้คุณเลื่อนการค้นหาไปข้างหน้าเพื่อตอบคำถามที่คุณต้องการ ฉันไม่รู้ว่ามันช่วยคุณได้ไหม แต่บางทีคุณอาจจะหาข้อมูลที่มีประโยชน์


1

Wihtout ปรึกษา man page สำหรับการตั้งค่าสถานะที่ถูกต้องวิธีง่ายๆในการหาว่าบรรทัดคำสั่งและเวลาเริ่มต้นคืออะไร ps pswww ควรทำงาน คุณสามารถทำให้มันดูหรูหรายิ่งขึ้นหากต้องการโดยการอ่านหน้าคน


1

คำสั่งทั้งสองอยู่ในใจ:

1) รับเวลาเริ่มต้นสำหรับกระบวนการที่ออกจาก ' 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ซึ่งตอนนี้ฉันตรวจสอบฉันไม่ได้ติดตั้ง อย่างไรก็ตามคำอธิบาย man page บอกว่า:

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

แต่อย่างที่บางคนพูดว่า "ls -al / proc /" จะบอกคุณมากมาย!


0

คุณสามารถใช้ได้:

systemctl status <PID>

หรือด้วยชื่อของกระบวนการ:

systemctl status $(pgrep perl)

สิ่งนี้จะส่งข้อมูลเกี่ยวกับ systemd services ที่เริ่มกระบวนการของคุณ

ฉันพบคำใบ้นี้ที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.