วิธีรับเวลาเริ่มต้นของกระบวนการ Linux ที่ใช้งานนาน [ปิด]


250

เป็นไปได้หรือไม่ที่จะได้รับเวลาเริ่มต้นของกระบวนการทำงานเก่า ดูเหมือนว่าpsจะรายงานวันที่ (ไม่ใช่เวลา) หากยังไม่ได้เริ่มวันนี้และเฉพาะปีที่ไม่ได้เริ่มปีนี้ ความแม่นยำหายไปตลอดกาลสำหรับกระบวนการเก่าหรือไม่?


16
มีอะไรผิดปกติกับการใช้งานps -p <pid> -o lstartหรือไม่? ดูเหมือนว่ามันใช้ได้ แต่ฉันไม่แน่ใจว่าทำไมมันไม่ใช่คำตอบที่ชัดเจนทันทีหลายครั้งที่คำถามนี้ดูเหมือนจะเกิดขึ้น
ajwood

7
@ajwood จะเป็นการดีกว่าหากใช้ps -p <pid> -o lstart=เพื่อหลีกเลี่ยงการพิมพ์บรรทัดเพิ่มเติม (ส่วนหัว)
Vladimir Protasov

2
มีอะไรผิดปกติกับการใช้งานps -p <pid> -o lstartหรือไม่? บางทีความจริงอาจไม่มีlstartในฉบับ 2004หรือในปี 2013ของมาตรฐาน POSIX 1003.1?
Piotr Dobrogost

5
@PiotrDobrogost นั่นจะเป็นปัญหาหากคำถามถามเกี่ยวกับ POSIX แต่มันถามเกี่ยวกับ Linux
womble

4
Mods - techraf, Makyen, David Rawson, Tsyvarev, Paul Roub - ทำไมคุณไม่ย้ายไปยังเว็บไซต์ที่เหมาะสมกว่าเช่น StackExchange หรือ Superuser แทนที่จะปิดคำถาม? นี่เป็นคำถามที่ดีและมีประโยชน์
Hanxue

คำตอบ:


392

คุณสามารถระบุตัวจัดรูปแบบและใช้งานlstartได้เช่นเดียวกับคำสั่งนี้:

ps -eo pid,lstart,cmd

คำสั่งดังกล่าวจะส่งออกกระบวนการทั้งหมดโดยจัดรูปแบบที่จะได้รับ PID เรียกใช้คำสั่งและวันที่ + เวลาเริ่มต้น

ตัวอย่าง (จากบรรทัดคำสั่ง Debian / Jessie)

$ ps -eo pid,lstart,cmd
  PID CMD                                          STARTED
    1 Tue Jun  7 01:29:38 2016 /sbin/init                  
    2 Tue Jun  7 01:29:38 2016 [kthreadd]                  
    3 Tue Jun  7 01:29:38 2016 [ksoftirqd/0]               
    5 Tue Jun  7 01:29:38 2016 [kworker/0:0H]              
    7 Tue Jun  7 01:29:38 2016 [rcu_sched]                 
    8 Tue Jun  7 01:29:38 2016 [rcu_bh]                    
    9 Tue Jun  7 01:29:38 2016 [migration/0]               
   10 Tue Jun  7 01:29:38 2016 [kdevtmpfs]                 
   11 Tue Jun  7 01:29:38 2016 [netns]                     
  277 Tue Jun  7 01:29:38 2016 [writeback]                 
  279 Tue Jun  7 01:29:38 2016 [crypto]                    
      ...

คุณสามารถอ่านpsmanpage ของหรือตรวจสอบหน้าของ Opengroupสำหรับฟอร์แมตอื่น ๆ


3
@ bobbyrne01: เปลี่ยนคำสั่งเช่น pid, etime, cmd ใช้ได้กับฉันใน Debian Wheezy
exic

1
@Gobliins - etimeเป็นเวลาที่ผ่านไปตั้งแต่กระบวนการเริ่มต้น
wkl

4
เพื่อความสมบูรณ์สำหรับผู้ที่เคยใช้ไวยากรณ์ BSD: ps axo pid,cmd,lstartใช้ได้เช่นกัน
Graeme Moss

2
@ bobbyme01: ใช้ตัวเลือก -ww
Ed Randall

1
โปรดทราบว่าlstartเวลาสามารถเปลี่ยนที่statวิธีการดังต่อไปนี้มีความปลอดภัย - unix.stackexchange.com/questions/274610/...
slm

43

คำสั่ง ps (อย่างน้อยรุ่น procps ที่ใช้โดยลีนุกซ์จำนวนมาก) มีฟิลด์ฟอร์แมทจำนวนมากที่เกี่ยวข้องกับเวลาเริ่มต้นกระบวนการ, lstartซึ่งมักจะให้วันที่และเวลาแบบเต็มรูปแบบที่กระบวนการเริ่มต้น:

# ps -p 1 -wo pid,lstart,cmd
  PID                  STARTED CMD
    1 Mon Dec 23 00:31:43 2013 /sbin/init

# ps -p 1 -p $$ -wo user,pid,%cpu,%mem,vsz,rss,tty,stat,lstart,cmd
USER       PID %CPU %MEM    VSZ   RSS TT       STAT                  STARTED CMD
root         1  0.0  0.1   2800  1152 ?        Ss   Mon Dec 23 00:31:44 2013 /sbin/init
root      5151  0.3  0.1   4732  1980 pts/2    S    Sat Mar  8 16:50:47 2014 bash

สำหรับการอภิปรายถึงวิธีการเผยแพร่ข้อมูลในระบบไฟล์ / proc ดูที่ /unix/7870/how-to-check-how-long-a-process-has-been-running

(จากประสบการณ์ของฉันภายใต้ Linux, การประทับเวลาในไดเรกทอรี / proc / ดูเหมือนจะเกี่ยวข้องกับช่วงเวลาที่ไดเรกทอรีเสมือนถูกเข้าถึงเมื่อเร็ว ๆ นี้มากกว่าเวลาเริ่มต้นของกระบวนการ:

# date; ls -ld /proc/1 /proc/$$ 
Sat Mar  8 17:14:21 EST 2014
dr-xr-xr-x 7 root root 0 2014-03-08 16:50 /proc/1
dr-xr-xr-x 7 root root 0 2014-03-08 16:51 /proc/5151

โปรดทราบว่าในกรณีนี้ฉันรันคำสั่ง "ps -p 1" ที่เวลา 16:50 จากนั้นจึงสร้างเชลล์ bash ใหม่จากนั้นรันคำสั่ง "ps -p 1 -p $$" ภายในเชลล์นั้นหลังจากนั้นไม่นาน ... .)


หากต้องการดูทุกกระบวนการ (ไม่ใช่แค่ของคุณเอง) ให้เพิ่มอาร์กิวเมนต์e( psไวยากรณ์มาตรฐาน) หรือax(ไวยากรณ์ BSD) ลงในคำสั่ง ps: ie ps -ewo pid,lstart,cmdorps -axwo pid,lstart,cmd
Ryan Griffith

15

ในการติดตามคำตอบของ Adam Matanการ/proc/<pid>ประทับเวลาของไดเรกทอรีดังกล่าวไม่จำเป็นต้องมีประโยชน์โดยตรง แต่คุณสามารถใช้

awk -v RS=')' 'END{print $20}' /proc/12345/stat

เพื่อรับเวลาเริ่มต้นในนาฬิกาติ๊กตั้งแต่เริ่มระบบ 1

เป็นหน่วยที่ใช้ยากเล็กน้อย ดูการแปลง jiffies เป็นวินาทีเพื่อดูรายละเอียด

awk -v ticks="$(getconf CLK_TCK)" 'NR==1 { now=$1; next }
    END { printf "%9.0f\n", now - ($20/ticks) }' /proc/uptime RS=')' /proc/12345/stat

สิ่งนี้จะให้เวลาไม่กี่วินาทีกับคุณซึ่งคุณสามารถส่งผ่านไปstrftime()ยังเพื่อให้ได้เวลา (ที่มนุษย์อ่านได้หรืออื่น ๆ )

awk -v ticks="$(getconf CLK_TCK)" 'NR==1 { now=$1; next }
    END { print strftime("%c", systime() - (now-($20/ticks))) }' /proc/uptime RS=')' /proc/12345/stat

อัปเดตด้วยการแก้ไขบางอย่างจาก Stephane Chazelas ในความคิดเห็น; ขอบคุณเช่นเคย!

หากคุณมี Mawk เพียงลองดู

awk -v ticks="$(getconf CLK_TCK)" -v epoch="$(date +%s)" '
  NR==1 { now=$1; next }
  END { printf "%9.0f\n", epoch - (now-($20/ticks)) }' /proc/uptime RS=')' /proc/12345/stat |
xargs -i date -d @{}

1 คน proc ; ค้นหาเวลาเริ่มต้น


ได้รับการปรับปรุงใหม่เล็กน้อยสำหรับการใช้งานจริง: gist.github.com/tripleee/2a1622fdf8ab080ce3b36d95af60010a
tripleee

1
โปรดจำไว้ว่าstrftime()และsystime()ไม่มีในmawkซึ่งเป็นค่าเริ่มต้นawkในภาพ Debian 8 VPS ของฉันดังนั้นฉันสามารถสันนิษฐานได้ว่ามันเป็นภาษาเฉพาะgawkของภาษานั้นเท่านั้น
ssokolow

13
ls -ltrh /proc | grep YOUR-PID-HERE

ตัวอย่างเช่น PID ของ Google Chrome ของฉันคือ 11583:

ls -l /proc | grep 11583
dr-xr-xr-x  7 adam       adam                     0 2011-04-20 16:34 11583

6
สิ่งนี้ใช้ไม่ได้สำหรับฉัน - มันพิมพ์เวลาแก้ไข (อาจเปลี่ยนบ่อย) อาจเป็นเพราะ: unix.stackexchange.com/questions/20460/…
user920391

การประทับเวลาของ / proc / <pid> ไม่น่าเชื่อถือ
Henning

1
สิ่งนี้ส่งคืนในเวลา 9 นาทีหลังจากกระบวนการที่ฉันมีข้อมูลเกี่ยวกับได้เริ่มจริง
Dan Dascalescu

1
นี่เป็นตัวเลือกเดียวของฉันที่ใช้งานได้ แต่อาจไม่น่าเชื่อถือ ฉันอยู่ในระบบฝังตัวที่มีเพียงช่องว่างpsซึ่งระบุinvalid optionไว้สำหรับตัวเลือกทั้งหมดที่กล่าวถึงโดยคำตอบอื่น ๆ
Qi Fan

7
ทำไมgrep? ทำไมls -ldh /proc/$pidล่ะ หรือดียิ่งขึ้นdate -r /proc/$pid?
Caesar


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