กระบวนการเริ่มต้นเมื่อใด


31

หากต้องการทราบว่าเมื่อใดที่กระบวนการเริ่มต้นการคาดเดาครั้งแรกของฉันคือการตรวจสอบเวลาที่/proc/<pid>/cmdlineถูกเขียน / แก้ไขในครั้งสุดท้าย

psยังแสดงSTARTฟิลด์ ฉันคิดว่าแหล่งข้อมูลทั้งสองนี้จะเหมือนกัน บางครั้งพวกเขาก็ไม่เหมือนกัน นั่นเป็นอย่างไร


คำตอบ:


44

อย่างน้อยใน Linux คุณสามารถทำสิ่งต่อไปนี้

ps -o lstart= -p the-pid

เพื่อให้มีเวลาเริ่มต้นที่เป็นประโยชน์มากขึ้น

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

mtimes ของไฟล์ใน/procLinux (อย่างน้อย) มักเป็นวันที่ไฟล์เหล่านั้นถูกสร้างอินสแตนซ์ซึ่งจะเป็นครั้งแรกที่สิ่งที่พยายามเข้าถึงพวกเขาหรือรายการเนื้อหาของไดเรกทอรี

ตัวอย่างเช่น

$ sh -c 'date +%T.%N; sleep 3; echo /proc/"$$"/xx*; sleep 3; stat -c %y "/proc/$$/cmdline"'
13:39:14.791809617
/proc/31407/xx*
2013-01-22 13:39:17.790278538 +0000

การขยายจะ/proc/$$/xx*ทำให้เชลล์อ่านเนื้อหา/proc/$$ซึ่งทำให้cmdlineไฟล์นั้นถูกอินสแตนซ์

ดูเพิ่มเติม: การประทับเวลาของซ็อกเก็ตใน / proc // fd


11

procเป็นระบบไฟล์เสมือนดังนั้นฉันจะไม่พึ่งพาข้อมูลสถานะไฟล์ใด ๆ

เวลาเริ่มต้นของกระบวนการตั้งอยู่ที่/ proc / PID / สถิติคอลัมน์22 มันได้รับในระยะเวลาอันสั้นหลังจากการบูตระบบ ในการแปลงเป็นวินาทีคุณต้องหารด้วยsysconf(_SC_CLK_TCK)100 สำหรับระบบส่วนใหญ่ (แต่ไม่ใช่ทั้งหมด!)

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

เมื่อมีตัวเลขสองตัวนี้คุณจะลบตัวเลขแรกจากวินาทีและคุณจะได้จำนวนวินาทีที่ผ่านไปนับตั้งแต่เริ่มต้นโปรแกรม

ตัวอย่าง (สำหรับpidgin ):

PID=$(pidof pidgin)
STARTTIME=$(awk '{print int($22 / 100)}' /proc/$PID/stat)
UPTIME=$(awk '{print int($1)}' /proc/uptime)
NOW=$(date +%s)
DIFF=$((NOW - (UPTIME - STARTTIME)))
date -d @$DIFF

หมายเหตุ: ตัวอย่างง่ายๆนี้จะไม่ทำงานหากpidofส่งคืน PID หลายรายการ


มีความคิดเห็นเกี่ยวกับ proc / <pid> / cmdline เมื่อไหร่ที่จะถูกเขียนถึง? มีรายการ proc / <pid> ใด ๆ สำหรับเรื่องนั้น
Swair

2
โดยปกติไฟล์เหล่านั้นจะถูกสร้างโดยเคอร์เนลแบบไดนามิกเมื่อใดก็ตามที่คุณพยายามอ่านพวกเขาและส่วนใหญ่จะมีเนื้อหาแบบไดนามิก cmdlineไม่ได้ แต่ฉันไม่สามารถจินตนาการได้ว่ามีนโยบายอย่างเป็นทางการที่ระบุว่าจะต้องสร้างขึ้นครั้งเดียวเมื่อกระบวนการเริ่มต้นและจะไม่ถูกสัมผัสอีกครั้ง
scai

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